まず第一に、私はプログラマーではないので、これに対する答えはより経験豊富な人にとっては完全に明白かもしれません。 いくつかの確率パズルを解決するためにPython(2.5)で遊んでいましたが、私は彼らがすべきだと思ったマークから離れた結果を得続けました。だからいくつかの実験の後、私は問題を引き起こしていた動作を特定することができました。 は奇妙な行動を隔離するように見えたスクリプトはこれです:非常に単純なPythonスクリプト、難問な動作
今import random
random.seed()
reps = 1000000
sub = [0]*10
hits = 0
first = random.randint(0,9)
while True:
second = random.randint(0,9)
if second != first:
break
sub[first] = 1
sub[second] = 1
sub[random.randint(0,9)] = 1
for i in range(1,reps):
first = random.randint(0,9)
while True:
second = random.randint(0,9)
if second != first:
break
if ((sub[first]) or (sub[second])):
hits = hits + 1
print "result: ", hits*1.0/reps*100.0
、これは私が最初に解決しようとしていた問題ではありませんし、このスクリプトの結果は単純で90分の34または周り37.7する必要があります十分なコンビナトリアル。時々、スクリプトはその結果を出しますが、より頻繁に53.4が得られます。これは意味をなさないと思われます。 これは、ちょうどこのスクリプトが正しく動作する理由についてのアイドルな好奇心です。
「integer」除算ではなく「real」除算をシステムに強制する方法として、ヒット/リピートの代わりにヒット* 1.0/repsを行っているようです。スクリプトの先頭に "from __future__ import division"を置くこともできます。そして、それは常に本当の分割を行います。必要に応じて//を使って "整数"除算を得ることができます。多くのことについては、これは事をより簡単にします。 – MatrixFrog