2016-04-17 2 views
0

私は9人のボックスで表される彼の部屋から逃げ出すルークの確率を見つけるために一連の関数を作成しました。ルークは、3x3の正方形の中心(0,0)から始まり、右/左または上/下に移動することができます(右または左に移動することができません。 。ルークは彼(2,0)または(-2,0)のどちらかの側のドアから出てエスケープするはランダム関数で始まり、次に代替(Python)

私は基本的なゲームを書いているが、私はどのように取得するためのノットに頭を結んでいるルークはランダムな方向から始める。下のコードが示すように、私は彼が最初に右/左に行くようにしています。私は、ルークの最初のステップのためにどちらかの方向に、そして次に交互に方向を変えて、等しいチャンスを持たせたいと思います。どのようにこれを行うにはどのようなアイデア?

import random 

def checkXState(x): 
    right=x+1; 
    left=x-1; 
    xc = random.choice([right,left]) 
    return xc 

def checkYState(y): 
    up=y+1; 
    down=y-1; 
    yc = random.choice([up,down]); 
    return yc 


def theRule(x,y): 
    #the Rule determines whether Luke is awake or not, and is applied to each step 
    if (x==2 and y == 0) or (x==-2 and y==0): 
     return 'Luke has ESCAPED'; 
    elif (x==2 or x==-2 or y==2 or y==-2): 
     return 'Luke is AWAKE'; 

def theGame(): 
     x=0; 
     y=0; 
     while True: 
       x = checkXState(x); #Luke goes right or left, new x coord stored in x 
       print(x,y); 
       a = theRule(x,y); 
       if a==('Luke is AWAKE' or 'Luke has ESCAPED'): 
         print(a) 
         break; 
       y = checkYState(y); 
       print(x,y); 
       b = theRule(x,y); 
       if b==('Luke is AWAKE' or 'Luke has ESCAPED'): 
         print(b) 
         break; 
+0

私はこの問題を十分に理解していないかもしれません。ルークがy = 1、x = 2にあり、右に行きたい場合はどうなりますか? – tfv

+0

y = 1およびx = 2の場合、ルークは壁に当たって目を覚ます。関数はそこで終わります – st4rgut

答えて

1
directions = ["up", "down", "left", "right"] 

start_dir = random.choice(directions) 

if start_dir == "left" or start_dir == "right": 
    checkXstate(x) 
else: 
    checkYstate(y) 
+0

これは最初のステップでどのようにランダムな方向を選択するのかを見ていますが、後でどのように方向を変えますか?たぶん、それぞれの条件文の中のwhileループがうまくいくかもしれません。 – st4rgut

+0

whileループの中にstart_dirとif部分を入れてください。 – marienbad

+0

これを使用した場合は、正しいとマークしてください! – marienbad

1
  1. あなたが最初にどこへ行くの擬似均等に分布決定を取得することが十分なら、あなたは自分の最初の段階の意思決定のためにもrandomを使用することができます。 EDIT:実際にあなたはすでにそれをやっているわけではありませんが、マリエンバートの答えはこの問題を解決します。これは私が最初に理解できなかったあなたの意図した質問かもしれません。

  2. 彼が自分の部屋から脱出する確率を正しく計算したい場合は、最初のステップが正しい方法でないとランダムな方向が変わってしまいます(明らかにランダムですので非常にまれなケースでもルークが部屋を脱出することはありません)。実際の解決策は、例えば、すべての可能性をシミュレートするようなものにして、割合を得るのは#escaping/#allです。 (例としてbacktrackingでこれを行うことができます)

  3. 最初のステップが「均等に配分されている」ことを本当に気にしていれば、2で説明したのと同じことができます。ステップ。つまり、4つの可能な最初のステップで4回全体をシミュレートし、その後すべての確率を合計して4で割ることを意味します。しかし、現時点では確率を実際に印刷していないため、それがあなたが本当に望むものなら100%確信しています。

1

なぜならば、単純な文と、乱数を取得し、その後、ちょうどそれがに等しいかを確認するかのケースを使用するためにsrand関数を使用しています。

これは擬似ランダムであることに注意してください。ただし、それは実際にセキュリティ上の問題を引き起こすものではありません。

int start_choice = srand(2) + 1; 

if(start_choice == 1) {x = checkXState(x); } 
if else (start_choice == 2) { y = checkYState(y); } 
else() {} 
関連する問題