infinitesimal.py
じゃんけんを使っての無限小の考察をするシミュレーションプログラム
二人でじゃんけんをすると結果は、自分が勝ち、相手が勝ち、あいこ、のいずれかです。
この3つの場合は等しく1/3の確率で現れます。
あいこの場合、勝負が付くまでじゃんけんをすることにすると
lim n→∞ Π(i=1,n)1/3=0
で、永遠に勝負がつかない可能性は、極限の数式上は0ですが、そういう場合も存在し、確率は無限小と言えます。
この問題は、ネットワーク通信に於いて等価のコンピュータのサーバ、クライアントを乱数で決定する時にも存在します。乱数で決定しようとすると、この問題は厳密には解決不能ですが、十分な回数試行をすると、実用上は十分です。
CPU IDやIPアドレスのようなアイデンティティを利用するとこの問題は解決します。
IPアドレスが分かれば、pingを打って、応答が返ってくれば、相手が繋いでることが分かります。それから、おもむろにサーバ、クライアントを決定すればよいでしょう。
サーバ、クライアント決定は、ネットワークゲームのプレイヤー先攻、後攻決定と同じです。
複数のプレイヤーのIDが必要ならば、CPU IDやIPアドレスの大小関係を利用すればよいでしょう。
インターネット関係の本を読んでいたら、コンピュータがサイコロを振ることが載っていましたが、このことかどうか分かりません。
検証プログラム
truerand.py モジュールを使っています
#!/usr/bin/python3
import truerand
te=[ 'パー','チョキ','グー' ]
def game(a,b):
if a=='パー':
if b=='パー':
return 'draw'
elif b=='チョキ':
return 'lose'
else:
return 'win'
elif a=='チョキ':
if b=='パー':
return 'win'
elif b=='チョキ':
return 'draw'
else:
return 'lose'
else: # a=='グー'
if b=='パー':
return 'lose'
elif b=='チョキ':
return 'win'
else:
return 'draw'
def main():
while True:
self=te[truerand.rand(1)%3]
opp=te[truerand.rand(1)%3]
result=game(self,opp)
print(f"自分:{self} 相手:{opp} 結果:{result}")
if result=='draw': # あいこ
continue
break
if __name__=="__main__":
main()