2009-06-13 20 views
1

まず第一に、私はプログラマーではないので、これに対する答えはより経験豊富な人にとっては完全に明白かもしれません。 いくつかの確率パズルを解決するために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が得られます。これは意味をなさないと思われます。 これは、ちょうどこのスクリプトが正しく動作する理由についてのアイドルな好奇心です。

+0

「integer」除算ではなく「real」除算をシステムに強制する方法として、ヒット/リピートの代わりにヒット* 1.0/repsを行っているようです。スクリプトの先頭に "from __future__ import division"を置くこともできます。そして、それは常に本当の分割を行います。必要に応じて//を使って "整数"除算を得ることができます。多くのことについては、これは事をより簡単にします。 – MatrixFrog

答えて

3

結果はどうかライン13によって異なります。あなたはfirstと同じであることからsecondを守る

sub[first] = 1 
sub[second] = 1 

、しかし:

sub[random.randint(0,9)] = 1 

はライン11または12のいずれかと同じインデックスに当たりますその第3のエントリがfirstまたはsecondのいずれかと同じであることから保護しないでください。

+0

ああ、今私はそれを見逃すために愚かな感じ、それがそこにいるはずだったとは思わない:( –

5

ところで、「含ま0と9の間の3つの異なるランダムに分布した整数を生成」するための最良の方法のために、私は心からではなく、あなたがしているwhileループよりも、[] Python 3.0で/ [S/xrangeの/範囲] a, b, c = random.sample(xrange(10), 3)をお勧めしますを使用して。

関連する問題