はてなキーワード: 乱数とは
俺はスポーツが嫌いだ。
人間に優劣をつけようとする。
持って生まれた才能・使ってきた時間・環境との相性・交友関係・天運、とにかく様々な要素を組み合わせていって「貴方は全体で何番です」みたいに序列をつけようとする。
そういう態度が気に食わない。
単に遊びの優劣が"絶対的価値"であるかのように錯覚させたがる。
その割にはいざ構造欠陥についての指摘を受ければ「たかが遊びだ。本気であーだこーだ言うもんじゃない」といった態度を抜かす。
"たかが遊び"といった態度と"絶対的序列"の両方のスタンスに陣取って都合良く論点を切り替える薄汚い存在、それがスポーツだ。
俺はゲームが好きだ。
単に楽しければそれでいいからだ。
ゲームも時に順位をつけるが、それらはゲーム内に仕込まれた乱数によって変動しがちなのもあって"絶対的序列"と成るのは子供の世界ぐらいのものだろう。
自分たちが遊びであることを割り切って意図的に乱数や抜け道を仕込み、何度も繰り返せばいつかはクリア出来るようにしたり、クリア出来ないことが実生活に陰を落とさないようになっている。
割り切っている。
自分のスタンスをチラチラと動かしてやってきた状況に合わせてゴールポストを必死に動かして回ったりなんかしない。
遊びとしての潔さがあり、挑む側としても気持ちよくシンプルな気持ちで相手が出来る。
俺は好きじゃない。
"たかが遊び"としてスタンスを一貫していたはずのゲームが「いいえ、e-スポーツでの勝利には"絶対的価値"があります。賞金も1億円出します」なんて突然言い出す。
そしてその次には「"絶対的序列"を決めるようなものが、人の一生を時に左右するものが"ただの遊び"と言い張って乱数まみれにするのは駄目ですよね。ゲームバランスも完璧を目指します」なんて言い出す。
ふざけている。俺はここの「完璧なバランス調整を目指します。だってスポーツだから」という流れが本当に大嫌いなのだ。
言ってしまえばゲームを開発している側が「スマブラは終点アイテムなし以外ありえないよね。アイテムとかどうせ誰も使わないから無くしてもいいよね」と言い出すようなもんだ。
そうしてゲームはどんどん「強い人がほぼ確実に毎回勝って、次に強い人が毎回2位で、その次が3位、そして一番下手な奴はいつもビリになる」という状態になる。
なあ、息苦しくないか?
俺はゲームに対して「俺達の誰が一番優れているか決めてくれよ」なんて頼んだことはない。むしろ「なんかいい感じに曖昧にしてよ。その方がパーティーとして気楽だからさ」と願ってきた。
だがe-スポーツなるものを目指し始めるとゲームはどうやっても「優勝するに足る人が優勝しましたよ」の形を目指すことになる。それは"スポーツとして正しい姿"何だと思う。
"スポーツとして正しい姿"は"たかが遊び"と両立するのが難しい。
なぜなら"スポーツとして正しい姿"というのは、"絶対的序列"を決定するための"測定装置"でなければいけないからだ。
"測定装置"であることを目指すということは、遊びとしての遊びを失うってことだ。
そう、「遊びが、遊びを失う」んだよ。まさにこれこそが問題だ。
"測定装置"に徹すれば徹するほどに、それは余裕のないものになる。
余裕のないものになればなるほど、それを遊んでいる側の態度も余裕を失っていく。
休日にヘラヘラとネット上の知り合いとボイチャしながら酒を飲みつつ遊ぶようなものからは遠ざかる。
「皆さんもっと基礎練習をやって下さい。今回我々のチームはゴールドリーグの中で上位争いをしており、上手くやれば次節はプラチナリーグを目指せます。頑張りどころですよ」なんてふざけた話が始まるのだ。
クソッタレも良い所だ。なんでそんな必死になって結果を出そうとしなけりゃならないんだ?そういうのは仕事だとか、資格勉強だとか、せめて子育てとか、家事とかでやるべきだろ。
必死になってもいいかも知れない場所が無数にある人生の中で、必死にならなくてもいいような場所としてゲームを楽しんでいた所に"遊びのない遊び"としていきなりやてってくるクソッタレ、それがe-スポーツなんだよ。
俺はe-スポーツが嫌いだ。
完璧に近い競技性なんて俺は求めない。むしろ不完全なぐらいで丁度いいんだ。理不尽な負けを「まあ俺も同じ感じで勝ったこと結構あるしな」と笑い飛ばしながらビールと一緒に飲み下すぐらいでいいんだ。
ゲーム業界の中でe-スポーツなんかに染まらずに"たかが遊びのゲーム"であり続けているゲームの皆さん。本当にありがとうございます。
e-スポーツにならなきゃ真のゲームじゃないとか、e-スポーツをやらなきゃ真のゲーマーじゃないとか、そういうクソッタレでつまんねえイキった風潮に負けないでください。
完璧なゲームバランスの対人ゲームとか現実でやりゃあいいのにゲームの中での勝った負けたを"絶対的序列"に変換して「僕ちゃんはお前よりゲームが上手いから凄いんだ!」とエバろうとするガキに媚びない姿勢、カッコイイです。
まあ、一部の勝ち負けにしか価値を見いだせないくせに何故かゲームの世界に引きこもりたがるしょーもない奴らの財布を当てにするようなゲームが市場にちょっとぐらいあるのは良いと思います。多様性はゲームの魅力ですからね。
でも全部のゲームがそうなっていこうとする流れは絶対に間違ってます。
以上ですわ。
物理的に考えれば「機械を操作すれば狙った番号に当てられるのではないか」という疑念を抱くのは自然なことです。しかし、宝くじの公開抽せんで使われる「電動風車機」には、不正を極限まで排除するための厳重な仕組みが施されています。
仕掛けをして任意の番号を出すのが事実上不可能である理由は、主に以下の3点に集約されます。
電動風車機は、単にルーレットを回しているだけではありません。
円盤はかなりの高速で回転しており、さらに各桁(ユニット)ごとに回転速度やタイミングが微妙に異なります。
矢が放たれるタイミングは、機械的にあらかじめプログラムされているわけではなく、抽せん会場の「発射ボタン」を人間が押すことで決まります。コンマ数秒のズレで当選番号は全く別物になります。
抽せん機の信頼性を守るために、以下のようなプロセスが踏まれています。
的(円盤)や矢にわずかな重さの偏りがあれば、特定の番号に当たりやすくなります。そのため、抽せん前には極めて精密な測定が行われ、異常がないか確認されます。
本番直前には何度もテスト走行が行われ、統計的な偏りがないかがチェックされます。
抽せん機は普段、厳重に保管されており、メンテナンスや移動の際も常に複数の関係者の監視下に置かれます。
もし「仕掛け」をするのであれば、装置の内部に遠隔操作用のメカニズムを組み込む必要がありますが、これは現実的ではありません。
抽せん機は透明なケースやオープンな構造になっており、怪しい配線や装置があればすぐに露呈します。
抽せん会には、主催者とは利害関係のない弁護士や自治体職員が「立会人」として出席します。彼らの仕事は「不正が行われていないか」を監視することであり、機械のセットアップから抽せん終了まで、すべてをチェックしています。
理論上、物理的な装置である以上「100%絶対に不可能」と断言するのは難しいかもしれませんが、「多くの専門家や監視の目を盗み、高速回転する円盤の特定の番号に矢を命中させる仕掛けを施す」コストとリスクは、宝くじの社会的信用を失うリスクに比べてあまりに大きすぎます。
現在の手法は、現代のデジタル技術(乱数生成プログラム)よりも、むしろ「誰の目にも物理的な動きが見える」という点で、最も信頼性が高いと考えられています。
あなたの文章にはいくつかのテーマが含まれています。ユダヤ教的な視点からそれぞれを考えてみましょう。
ユダヤ教では、人間の行動が単なる機械的・自然的な反応ではなく、自由意志によって導かれると考えます。
トーラーの中でも、神はモーセを通じてイスラエルにこう語ります:
つまり、人間は決定論的な存在ではなく、ズレる存在。あえて予測不能な方向に選択できる存在として神に似せて創造された、という思想です(創世記1:27参照)。
この意味で、「ズレ」は単なる奇行ではなく、機械的な自然の流れに対して、神的な選択を行う余地そのものを象徴しているとも言えます。
あなたが挙げた「量子乱数で行動すればズレが作れる」という発想は非常に現代的です。
ただしユダヤ教的には、偶然のように見えることも神の摂理の中にあります。タルムード(バヴァ・バトラ 91b)はこう言います:
「人は自分の行いを選ぶが、その結果を決めるのは天の御手にある。」
つまり、予測不能な行為も偶然も、本当の自由は倫理的な方向へ意識的に選ぶ力にこそある、と考えます。
「すべては天に定められているが、神を畏れることだけは人に委ねられている。」
つまり、自由意志の究極の目的は倫理的選択にある。本能的なズレではなく、意識的に正しい方向にズレること。それが神の似姿としての人間の使命です。
| あなたの主題 | ユダヤ的視点 |
| ズレ・予測不能性 | 自然や決定論を超えた自由意志の表れ |
| 量子乱数・偶然 | 神の摂理の一部であり、倫理的選択の舞台 |
| 自由意志 | 神に似せて創られた人間の本質 |
| 倫理的行動 | 自由意志の目的。創造のパートナーとなる道 |
まずさ「情報を持つものをシグナル、持たないものをノイズ」という定義だと、真の乱数以外は全部シグナルってことになっちゃうわけ
んで、ノイズによって何が「阻害」されるかといったら、突き詰めれば目的分布なわけね
つまり、各々の主体が目的分布に近くなるように情報操作しようとしていて、目的分布から遠ざかるものを「ノイズ」と言えばいいことがわかる
金融屋にとっての目的分布はリターン最大化、物理屋にとってはエントロピー最小化、情報理論屋なら通信路容量の最大化、とまあ立場によって違う
だから、同じビット列でもあるやつにはシグナル、別のやつにはノイズになる
で、この定義の良いところは、ノイズを「無意味」とか「カス」じゃなくて、目的関数からの偏差として数値化できるってとこ
KLダイバージェンスでも、距離関数でも、定義した目的分布との差を測れば「これはノイズの寄与分」って言える
要は、ノイズってのは物理的に存在する何かじゃなくて、主体と目的分布の間に張り付く誤差の射影なんだよな
まず確認しておきたいのは、タルムード自体は「乱数」や「ノイズ」「シグナル」といった現代的な科学用語を直接扱ってはいません。
しかし、ランダム性や予測不可能性、そして「わずかな偏りからでも情報が得られる」という思想に通じる議論は、タルムードやユダヤ思想の中に見つけることができます。
タルムードは、人間の知識や未来の出来事に対して「完全に予測不可能」な領域が存在することを認めています。
タルムードでは「小さな違い」や「わずかな兆し」から多くを学び取る態度が重要視されます。
つまり「完全なランダムは人間に情報を与えないが、わずかな偏りは豊かな意味をもたらす」という見方は、タルムード的に言えば「しるしを手がかりに学ぶ」という態度と対応します。
タルムードは、人間の行動や言葉には必ず「傾向」や「意図」が反映されると見ます。完全に無意味・ランダムな行動は存在しない、という立場です。
wつけるつけないも乱数か
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250715191146# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaHYpYwAKCRBwMdsubs4+ SOk1AP0Q7cO4U/di0xvoLORX9htxJF/bMJLx2j2vYb2V/pXYcAD/VEH0DwuAdiip uOW/3b4fZOMqUGcLcDVHqlBCXCRiXQA= =3UrT -----END PGP SIGNATURE-----
反応同じだしぼっとか。投稿頻度もちょっと人間と紛らわしくするために完全検知即レスじゃなくて乱数つけてるのか。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250715190043# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaHYmzQAKCRBwMdsubs4+ SATlAQCtJ+02jsTW5AdncUGCXzwX1M4Qi6jeTwFck4YN7vSS+wD/QrypQbre/cWH IegSuOk6qABDbqmZsrv36HtQPPdacQg= =kLwQ -----END PGP SIGNATURE-----
python import random import numpy as np import matplotlib.pyplot as plt from collections import defaultdict # 飴の配布システムのシミュレーション class CandyDistributionSystem: def __init__(self): """ 設計意図: このシステムは経済における資源分配の不平等性をモデル化しています。 特に少数の特権層(Aグループ)が富を集中させ、再分配システムからも不均衡に利益を得る 構造的問題を表現しています。 """ # 各グループの人数設定 self.group_a_count = 8 self.group_b_count = 2498 self.group_c_count = 7494 self.total_participants = self.group_a_count + self.group_b_count + self.group_c_count # 飴の提出数設定 self.contribution_per_a = 624 self.contribution_per_b = 2 self.contribution_per_c = 1 # 各グループの総貢献計算 self.total_a_contribution = self.group_a_count * self.contribution_per_a self.total_b_contribution = self.group_b_count * self.contribution_per_b self.total_c_contribution = self.group_c_count * self.contribution_per_c self.total_contribution = self.total_a_contribution + self.total_b_contribution + self.total_c_contribution # 配布用と貯金用の飴の区分 self.distribution_limit = 10000 self.savings = max(0, self.total_contribution - self.distribution_limit) # 結果追跡用の辞書 self.results = { 'A': defaultdict(int), 'B': defaultdict(int), 'C': defaultdict(int) } def distribute_candies(self, method='original'): """ 設計意図: 配布方法の選択によって、特権の固定化や格差拡大がどのように進むかを 示します。'original'メソッドは意図的にAグループを優遇するよう設計されています。 Parameters: ----------- method: str 配布方法 ('original', 'lottery', 'first_come', 'new_condition', 'fair') """ # Aグループへの確定配布 a_distribution = 625 * self.group_a_count remaining = self.distribution_limit - a_distribution # 残りの参加者数 remaining_participants = self.total_participants - self.group_a_count # Aグループの結果記録 for _ in range(self.group_a_count): self.results['A'][625] += 1 # 各配布方法によって処理が異なる if method == 'original': # オリジナルの問題設定通りの配布(5000人に1個ずつ、残りは0個) lucky_count = remaining # 5000人が当選 # B+Cグループの混合リスト作成 bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count random.shuffle(bc_participants) # 当選者に配布 for i in range(len(bc_participants)): participant_id, group = bc_participants[i] if i < lucky_count: self.results[group][1] += 1 else: self.results[group][0] += 1 elif method == 'lottery': # 抽選方式(BとCグループから無作為に5000人選出) bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count winners = random.sample(bc_participants, remaining) # 当選・落選のカウント for _, group in winners: self.results[group][1] += 1 # 落選者のカウント self.results['B'][0] = self.group_b_count - self.results['B'][1] self.results['C'][0] = self.group_c_count - self.results['C'][1] elif method == 'first_come': # 先着順方式(アクセス速度による先着順を乱数でシミュレート) # 設計意図: 先着順は単なる運の要素を超えて、情報格差や技術格差も含む制度設計 bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count # 現実では、情報を早く得られる人や高速インターネット接続を持つ人が有利 # これをシミュレートするため、Bグループにわずかなアドバンテージを与える bc_speeds = [] for id, group in bc_participants: if group == 'B': speed = random.random() + 0.1 # Bグループに小さなアドバンテージ else: speed = random.random() bc_speeds.append((id, group, speed)) # 速度順にソート bc_speeds.sort(key=lambda x: x[2], reverse=True) # 当選者決定 for i in range(len(bc_speeds)): _, group, _ = bc_speeds[i] if i < remaining: self.results[group][1] += 1 else: self.results[group][0] += 1 elif method == 'new_condition': # 追加条件方式(恣意的な条件を設定) # 設計意図: 新たな条件の設定は往々にして既存の特権を温存するように設計される bc_participants = [(i, 'B', random.random()) for i in range(self.group_b_count)] + \ [(i, 'C', random.random()) for i in range(self.group_c_count)] # Bグループに有利な条件を設定(例: 特定の知識やスキルを持つ人のみ) # この「条件」は表面上は中立的だが、実際には特定グループに有利になるよう設計 def meets_condition(participant): _, group, rand_val = participant if group == 'B': return rand_val > 0.3 # Bグループには70%の確率で合格 else: return rand_val > 0.7 # Cグループには30%の確率で合格 # 条件に合致する人を抽出 eligible = [p for p in bc_participants if meets_condition(p)] # 条件に合致する人が多すぎる場合は抽選 if len(eligible) > remaining: winners = random.sample(eligible, remaining) else: # 条件に合致する人が足りない場合、全員に配布 winners = eligible # 当選者をカウント for _, group, _ in winners: self.results[group][1] += 1 # 落選者のカウント self.results['B'][0] = self.group_b_count - self.results['B'][1] self.results['C'][0] = self.group_c_count - self.results['C'][1] elif method == 'fair': # 公平な再分配方式(貢献度に応じた配布) # 設計意図: この方法は「貯金分」も含めた全ての飴を、各グループの貢献度に応じて分配 # これにより構造的不平等を軽減、結果としてより多くの人が少なくとも損をしない状態になる # 全飴(貯金分も含む)を使った配布 total_to_distribute = self.total_contribution # 各グループの貢献比率計算 a_ratio = self.total_a_contribution / self.total_contribution b_ratio = self.total_b_contribution / self.total_contribution c_ratio = self.total_c_contribution / self.total_contribution # 各グループへの配布数決定 a_share = int(total_to_distribute * a_ratio) b_share = int(total_to_distribute * b_ratio) c_share = int(total_to_distribute * c_ratio) # 端数調整 remainder = total_to_distribute - (a_share + b_share + c_share) if remainder > 0: # 端数は最も人数の多いCグループに c_share += remainder # Aグループの配布(均等配分) per_a = a_share // self.group_a_count self.results['A'][per_a] = self.group_a_count # Bグループの配布(均等配分) per_b = b_share // self.group_b_count b_remainder = b_share % self.group_b_count self.results['B'][per_b] = self.group_b_count - b_remainder if per_b + 1 > 0 and b_remainder > 0: self.results['B'][per_b + 1] = b_remainder # Cグループの配布(均等配分) per_c = c_share // self.group_c_count c_remainder = c_share % self.group_c_count self.results['C'][per_c] = self.group_c_count - c_remainder if per_c + 1 > 0 and c_remainder > 0: self.results['C'][per_c + 1] = c_remainder def calculate_net_gain(self): """ 設計意図: この関数は各グループの純利益/損失を計算し、資源分配の公平性を 定量的に評価できるようにします。純利益/損失は個人の観点から見た経済的公正性の 重要な指標です。 """ net_gains = {} # Aグループの純利益計算 a_contribution = self.contribution_per_a a_distribution = list(self.results['A'].keys())[0] # 全員が同じ数を受け取る前提 net_gains['A'] = a_distribution - a_contribution # BとCグループの純利益計算(加重平均) for group, contribution_per_person in [('B', self.contribution_per_b), ('C', self.contribution_per_c)]: total_gain = 0 for received, count in self.results[group].items(): total_gain += (received - contribution_per_person) * count net_gains[group] = total_gain / (self.group_b_count if group == 'B' else self.group_c_count) return net_gains def analyze_results(self): """ 設計意図: この分析関数は、各グループの分配結果を詳細に調査し、 制度設計の公平性、貢献度と報酬の関係、およびシステムの持続可能性を 評価します。政策分析においては、こうした多角的な検証が重要です。 """ # 各グループの純利益/損失 net_gains = self.calculate_net_gain() # 貢献度分析 contribution_percentage = { 'A': (self.total_a_contribution / self.total_contribution) * 100, 'B': (self.total_b_contribution / self.total_contribution) * 100, 'C': (self.total_c_contribution / self.total_contribution) * 100 } # 飴を受け取った人の割合 received_percentage = { 'A': sum(count for received, count in self.results['A'].items() if received > 0) / self.group_a_count * 100, 'B': sum(count for received, count in self.results['B'].items() if received > 0) / self.group_b_count * 100, 'C': sum(count for received, count in self.results['C'].items() if received > 0) / self.group_c_count * 100 } # 分析結果の表示 print("\n===== 飴の配布システム分析 =====") print(f"総飴数: {self.total_contribution}個 (分配用: {self.distribution_limit}個, 貯金: {self.savings}個)") print("\n--- グループごとの貢献と結果 ---") for group in ['A', 'B', 'C']: group_size = getattr(self, f"group_{group.lower()}_count") contribution_per_person = getattr(self, f"contribution_per_{group.lower()}") total_contribution = getattr(self, f"total_{group.lower()}_contribution") print(f"\n{group}グループ ({group_size}人):") print(f" 貢献: 1人あたり{contribution_per_person}個 (総計: {total_contribution}個, 全体の{contribution_percentage[group]:.1f}%)") print(f" 受け取り状況:") for received, count in sorted(self.results[group].items()): print(f" {received}個: {count}人 ({count/group_size*100:.1f}%)") print(f" 飴を受け取った割合: {received_percentage[group]:.1f}%") print(f" 純利益/損失: 1人あたり平均 {net_gains[group]:.2f}個") print("\n--- 全体的な公平性分析 ---") print(f"最も得したグループ: {max(net_gains, key=net_gains.get)}グループ (+{max(net_gains.values()):.2f}個/人)") print(f"最も損したグループ: {min(net_gains, key=net_gains.get)}グループ ({min(net_gains.values()):.2f}個/人)") # 全員に飴が配布されたかどうか all_received = all(sum(count for received, count in self.results[group].items() if received > 0) == getattr(self, f"group_{group.lower()}_count") for group in ['A', 'B', 'C']) print(f"\n前提条件「全員に配布」の充足: {'はい' if all_received else 'いいえ'}") if not all_received: total_without = sum(self.results['B'][0] + self.results['C'][0]) print(f" 飴を受け取れなかった人数: {total_without}人") return net_gains, contribution_percentage, received_percentage def visualize_results(self): """ 設計意図: データの可視化は政策の効果や不平等性を直感的に理解するために重要です。 このようなグラフィカル表現によって、各グループ間の格差や制度設計の問題点を 一目で理解できるようになります。 """ # グラフのセットアップ fig, axes = plt.subplots(2, 2, figsize=(14, 10)) # 1. 貢献度のグラフ contributions = [self.total_a_contribution, self.total_b_contribution, self.total_c_contribution] axes[0, 0].bar(['Aグループ', 'Bグループ', 'Cグループ'], contributions) axes[0, 0].set_title('グループごとの総貢献飴数') axes[0, 0].set_ylabel('飴の数') # 貢献度の割合をアノテーションとして追加 total = sum(contributions) for i, v in enumerate(contributions): percentage = v / total * 100 axes[0, 0].text(i, v + 100, f'{percentage:.1f}%', ha='center') # 2. 1人あたりの貢献度と受け取り数の比較 group_names = ['Aグループ', 'Bグループ', 'Cグループ'] contribution_per_person = [self.contribution_per_a, self.contribution_per_b, self.contribution_per_c] # 各グループの平均受け取り数を計算 received_per_person = [] for group, letter in zip(group_names, ['A', 'B', 'C']): total_received = sum(received * count for received, count in self.results[letter].items()) group_size = getattr(self, f"group_{letter.lower()}_count") received_per_person.append(total_received / group_size) x = np.arange(len(group_names)) width = 0.35 axes[0, 1].bar(x - width/2, contribution_per_person, width, label='提出') axes[0, 1].bar(x + width/2, received_per_person, width, label='受け取り') # 純利益/損失をアノテーションとして追加 for i in range(len(group_names)): net = received_per_person[i] - contribution_per_person[i] color = 'green' if net >= 0 else 'red' axes[0, 1].text(i, max(received_per_person[i], contribution_per_person[i]) + 5, f'{"+" if net >= 0 else ""}{net:.1f}', ha='center', color=color) axes[0, 1].set_title('1人あたりの提出・受け取り飴数比較') axes[0, 1].set_xticks(x) axes[0, 1].set_xticklabels(group_names) axes[0, 1].set_ylabel('飴の数') axes[0, 1].legend() # 3. 各グループの受け取り状況の分布 # 各グループの受け取り状況を積み上げ棒グラフで表現 group_sizes = [self.group_a_count, self.group_b_count, self.group_c_count] received_counts = [] not_received_counts = [] for letter, size in zip(['A', 'B', 'C'], group_sizes): received = sum(count for received, count in self.results[letter].items() if received > 0) received_counts.append(received) not_received_counts.append(size - received) axes[1, 0].bar(group_names, received_counts, label='飴を受け取った人数') axes[1, 0].bar(group_names, not_received_counts, bottom=received_counts, label='飴を受け取れなかった人数') # 割合をアノテーションとして追加 for i in range(len(group_names)): if group_sizes[i] > 0: percentage = received_counts[i] / group_sizes[i] * 100 axes[1, 0].text(i, received_counts[i] / 2, f'{percentage:.1f}%', ha='center') axes[1, 0].set_title('グループごとの飴受け取り状況') axes[1, 0].set_ylabel('人数') axes[1, 0].legend() # 4. 貢献度vs報酬の分配公平性 # 貢献度と最終的な飴の配分の比較を円グラフで表現 total_contribution = self.total_contribution contribution_shares = [self.total_a_contribution / total_contribution, self.total_b_contribution / total_contribution, self.total_c_contribution / total_contribution] # 実際の配分シェアを計算 distribution_shares = [] for letter in ['A', 'B', 'C']: total_received = sum(received * count for received, count in self.results[letter].items()) distribution_shares.append(total_received / self.distribution_limit) # 2つの円グラフを並べて表示 ax4_1 = axes[1, 1].inset_axes([0, 0, 0.45, 1]) ax4_2 = axes[1, 1].inset_axes([0.55, 0, 0.45, 1]) ax4_1.pie(contribution_shares, labels=group_names, autopct='%1.1f%%') ax4_1.set_title('飴の貢献度割合') ax4_2.pie(distribution_shares, labels=group_names, autopct='%1.1f%%') ax4_2.set_title('飴の配分割合') axes[1, 1].axis('off') plt.tight_layout() plt.show() # 飴の配布システムをシミュレート candy_system = CandyDistributionSystem() # オリジナルの配布方法を実行 print("\n===== オリジナルの配布方法 =====") candy_system.distribute_candies(method='original') original_results = candy_system.analyze_results() candy_system.visualize_results() # 公平な配布方法を実験 print("\n\n===== 公平な配布方法のシミュレーション =====") fair_system = CandyDistributionSystem() fair_system.distribute_candies(method='fair') fair_results = fair_system.analyze_results() fair_system.visualize_results() # 公平な配布と元の配布の比較 print("\n\n===== 配布方法の比較 =====") print("オリジナル方式と公平方式の純利益/損失差:") net_diff = {} for group in ['A', 'B', 'C']: original_net = original_results[0][group] fair_net = fair_results[0][group] diff = fair_net - original_net net_diff[group] = diff print(f"{group}グループ: {'+' if diff > 0 else ''}{diff:.2f}個/人") print("\n結論:") if net_diff['A'] < 0 and net_diff['B'] > 0 and net_diff['C'] > 0: print("公平な再分配により、Aグループの特権が減少し、BとCグループの状況が改善されます。") print("これは構造的不平等の緩和に効果的です。") elif net_diff['A'] > 0: print("興味深いことに、公平な再分配ではAグループさえも利益を得られます。") print("これは、現行システムが特定グループだけでなく全体の非効率性につながっていることを示唆しています。")