コードにはいくつか問題があります。たとえば、door
の選択肢のリストを定義しますが、path
をchoice
関数に渡します。プログラムの最後にsteps
を印刷しますが、それはどこにも定義されていません。代わりにdays
、またはdays/1000
を印刷する必要があります。あなたがプログラミングしているときに、そのようなものに注意を払う必要があります!
他にも示されているように、2つのループでこれを行う必要があります。外部ループの各繰り返しが試行されます。内部ループは、帰宅するまでの経路を選択し、現在の合計に日数を加算します。
コードでは、各if
テストでは、ループの開始時に作成したランダムな選択肢の上に新しいランダムな選択肢が生成されます。それは正しくありません。ループの最上部で選択し、カウントに追加する日数を決定します。もしあなたが帰っていれば、ループから抜け出してください。
これは簡単な方法で行うことができます。 'a'、 'b'、または 'c'から選択するのではなく、各パスにかかる日数を1,2または3から選択するだけです。前述のように、Numpyを使用する必要はありません。Numpyを代理する代わりに、random
モジュール関数を直接呼び出すことができます。
ここで短いデモです。
from random import randint
trials = 10000
days = 0
for n in range(trials):
while True:
path = randint(1, 3)
days += path
if path == 1:
break
print(days, days/trials)
典型的な出力
59996 5.9996
我々は複数の実行を実行し、結果を平均化することにより、真の予定時刻に、より正確な推定値を得ることができます。前のコードを余分なループでラップすることでこれを行うことができますが、関数内に古いコードをラップしてその関数をループで呼び出すと、コードを読みやすくします。このように:真の期待値は6日ですよう
from random import randint
def sim(trials):
days = 0
for n in range(trials):
while True:
path = randint(1, 3)
days += path
if path == 1:
break
return days
num = 10
trials = 10000
total = 0
for i in range(num):
days = sim(trials)
x = days/trials
print(i, x)
total += x
print('Final', total/num)
典型的な出力
0 5.9732
1 6.007
2 6.0555
3 5.9943
4 5.9964
5 5.9514
6 6.0689
7 6.0457
8 5.9859
9 5.9685
Final 6.00468
に見えます。実際には、それを数学的に示すのは難しいことではありません。
dを帰宅予定日数に等しいとします。私たちが1日に家に帰る時間の1/3、2日で出発して1/3になるので、家に帰る前にまだd日間、私たちが帰る時間の1/3私たちが家に帰る前に3日後に始まり、再び、私たちはまだd日間を過ごしています。
私たちは式にそれを置くことができます。
d = (1/3)*1 + (1/3)*(2 + d) + (1/3)*(3 + d)
3*d = 1 + 2 + d + 3 + d
3*d = 6 + 2*d
d = 6
印刷 'の手順を'? 「ステップ」はどこに定義されていますか? 'path'はどこに定義されていますか? – TessellatingHeckler
かわいい問題ですが、なぜこれでNumpyを使用していますか? 'random'モジュール関数を直接呼び出すだけです。 –
以下のいずれかの回答が問題を解決する場合は、それを受け入れる必要があります(該当する回答の横にあるチェックマークをクリックしてください)。それは2つのことをします。あなたの問題があなたの満足のために解決されたことを誰にでも知らせることができます。詳しい説明は[here](http://meta.stackexchange.com/a/5235)を参照してください。 –