2017-10-13 9 views
2

問題:
1つだけが家に通う3つのパスがあります。ループを再起動し、Pythonで値を追加しますか?

  • 最初のパスは3日間失われ、別のパスを選択する必要がある冒頭に戻ります。
  • 2つ目のパスは2日間失われた後、最初に戻り、別のパスを選択する必要があります。
  • 最後のドアは1日後に帰宅します。

基本的には、最終パスを選択するまで続きます。私は1000試行をシミュレートすることによって家に帰るのにかかる平均時間を見つけようとしています。

days=0 
for i in range(1000): 
    door=["a","b","c"] 
    numpy.random.choice(path) 
    if numpy.random.choice(path)=="a": 
     days=+2 
    if numpy.random.choice(path)=="b": 
     days=+3  
    if numpy.random.choice(path)=="c": 
     days=+1 
print(steps) 

ようになり、私のコードは、わずか数日のように1-3からの値を出力します:ここで
は、私がこれまでにしたものです。
パスを選択するまで、1つを選択してから累積してループを再開するのに問題があります。
私は研究を行っており、whileループはうまくいくかもしれないと思いますが、私はしませんそれを適用する方法を知っている。ここで

+1

印刷 'の手順を'? 「ステップ」はどこに定義されていますか? 'path'はどこに定義されていますか? – TessellatingHeckler

+1

かわいい問題ですが、なぜこれでNumpyを使用していますか? 'random'モジュール関数を直接呼び出すだけです。 –

+0

以下のいずれかの回答が問題を解決する場合は、それを受け入れる必要があります(該当する回答の横にあるチェックマークをクリックしてください)。それは2つのことをします。あなたの問題があなたの満足のために解決されたことを誰にでも知らせることができます。詳しい説明は[here](http://meta.stackexchange.com/a/5235)を参照してください。 –

答えて

0

ドア「」は、それが家を取得するために1を追加し、選択されたときあなたは、あなたが立ち往生している間、繰り返し処理を続けるwhileループを使用してすることができますが、その人はもはや立ち往生していないので、whileループから脱落する。その後、もう一度whileループに入る前に、ちょうどstuck = Trueと設定して、プロセスは常に合計日数に加算し続け、最後に平均を取る。

import numpy 

days=0 
door=["a","b","c"] 

N = 1000 
for i in range(N): 
    stuck = True 

    while stuck: 
     if numpy.random.choice(door)=="a": 
      days += 2 

     if numpy.random.choice(door)=="b": 
      days += 3 

     if numpy.random.choice(door)=="c": 
      days += 1 
      stuck = False 

print('Average number of days taken to get home: ', days/N) 

私はこれが役立つことを願っています!

0

は、あなたが探しているコードです:

import numpy 

def runOnce(): 
    days = 0 
    door=["a","b","c"] 
    while(True): 
     path = numpy.random.choice(door) 
     if path=="a": 
      days+=2 

     if path=="b": 
      days+=3 

     if path=="c": 
      days+=1 
      return days 
total = 0 
for i in range(1000): 
    total += runOnce() 

print(total/1000.0) 
0

このコードは、あなたの問題を解決する必要があります。

import random 

doors = ['a', 'b', 'c'] 
total_days = 0 
runs = 1000 
for i in range(runs): 
    days = 0 
    choice = None 

    while choice != 'c': 
     choice = random.choice(doors) 
     if choice == 'a': 
      days += 2 
     if choice == 'b': 
      days += 3 
     if choice == 'c': 
      days += 1 
    total_days += days 
avg_days = total_days/runs 
print(avg_days) 
+0

整数除算を使用するCarefull! total_days = 999を計算すると、avg_days = 0になります。 'total_days = 0'を' total_days = 0.0'に変更するだけです。 – Stein

+1

@Stein整数の除算?そのコードは、Python 2で実行する場合にのみ整数除算を実行します。そして、この日には、OPがPython 3を使用していると仮定しなければなりません。 ;) –

+0

十分に公正です。残念ながら多くのプログラムではまだPython 2.7が必要です。 – Stein

0

私はあなたのルールではかなりわからないんだけど、これは私の試み他のいくつかのとは対照的に

import numpy as np 

def choose_path(): 
    p =np.random.randint(3) 
    #print("Path = {}".format(p)) 
    return p 


N = 100000 

days=0.0 
for i in range(N): 
    #make sure you don't take the wrong path twice 
    taken = [False, False, False] 

    path = choose_path() 
    while(path != 2): 
     if(path==0): 
      if(not(taken[path])): 
       taken[path] = True 
       days += 2.0 

     if(path==1): 
      if(not(taken[path])): 
       taken[path] = True 
       days += 3.0 

     path = choose_path() 
    days += 1.0 
    # print("Days = {}".format(days)) 

print("Average for {} iterations = {}".format(N, days/N)) 

ですコード私の男は同じルートを2回とらない。問題の定義方法がわかりません。私の解決策は3.5と思われます。 は、あなたが犯した過ちのいくつかは以下のとおりです。

  • =+は正の数a = +3またはa = -3 +=の割り当てであるあなたがドアを定義しますが、
  • それを使用することはありませんあなたが手順を定義することはありませんインクリメントa = a + 3 <=> a += 3
  • ですあなたはそれを使用します

私はあなたがアルゴリズムを思いついてから実装するべきだと思います。

0

コードにはいくつか問題があります。たとえば、doorの選択肢のリストを定義しますが、pathchoice関数に渡します。プログラムの最後に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 
関連する問題