2011-09-14 7 views
0

私はそれは、本質的に統計プログラムです。このコードこのPythonコードは、私がしたいことをやっているのですか?

import random 
b = 20 
x = random.randrange(0,b) 
y = random.randrange(0,b) 
ab = 0 
xc = 0 

while ab != 10: 
    if x != y: 
     x = random.randrange(0,b) 
     y = random.randrange(0,b) 
     xc = xc + 1 
    elif x == y: 
     print ab 
     print 'number of tries out of', b, ' : ', xc 
     ab = ab + 1 
     xc = 0 
     y = 999999 

を持っています。私は、10回試して見たいと思う何回乱数を一致させるために生成する必要があります。これまでのところ、このプログラムを実行した後の数字は、これらの値を取得しています。プログラムを5回実行したので、合計で50回試行されます。

9 
26 
6 
1 
5 
109 
5 
42 
12 
63 

それらの低い数字のすべてが私のプログラムは非常に幸運か何かが私のコードが間違っている場合だけであるならば不思議に私をリードしてきました。ありがとう!

注:whileループとwhileループの合計が表示されているときにXCを追加する方法がありますか?

+1

何千回も走らないのはなぜですか?数値が大きいほど統計量は高くなりますが、20はあなたのコンピュータが行うことができる数値では非常に小さい数値です。 –

+0

おそらくあなたの値を上に歪ませているのは、一致後、自動的にy = 9999を設定することによってx!= yを強制するということです.xとyのランダム値を選択しなくてもxcが最初にインクリメントされます1つの行に2つのマッチを選び、xcの値が0であることを少なくとも*可能にする必要があります)。また、ループのたびに「ランダムにインポートする」のはなぜですか(これはあなたのプログラムの動作に何らかの影響を与えているのではないでしょうか? – Peter

答えて

1

私はあなたがやや不運だと言いたいと思います。

平均27.8です。しかし、0と20の間の2つの数字を選んだ場合、それらの数字は時間の約1/20に一致すると予想されるため、一致する前に20回程度待ちます。

+0

y値を1 の設定番号に変更し、bを50に増やして範囲が1,50になるようにしました。 私の新しい値はまだ信じられません。 私は新しいプログラムで5回の試行を4回試しましたので、何か間違っているとは思わないでしょうか? – Drake

+0

4回の試行のうち4回? –

+0

私は新しいプログラムの4回の実行のうち5,5回、平均して5倍を得ました* 文法を言い訳 – Drake

1

は、繰り返しの数が多いことを確認します。

#!/usr/bin/env python 
import random 

max_num = 20 
x = random.randrange(0, max_num) 
y = random.randrange(0, max_num) 
tries = 0 

i = 0 
iterations = 1000 
total_tries = 0 
while i < iterations: 
    if x != y: 
     x = random.randrange(0, max_num) 
     y = random.randrange(0, max_num) 
     tries += 1 
    else: 
     print(i) 
     print('number of tries out of %s : %s ' % (max_num, tries)) 
     total_tries += tries 
     i += 1 
     tries = 0 
     y = -1 

print("Average tries: %s" % (total_tries/iterations)) 

私はこれを実行すると、私は〜20たびに取得します。

注:これは、このように単純化することができます

#!/usr/bin/env python 
import random 

max_num = 20 
iterations = 1000 
total_tries = 0 

for i in range(iterations): 
    print(i) 

    tries = 0 
    x = 0 
    y = -1 
    while x != y: 
     x = random.randrange(0, max_num) 
     y = random.randrange(0, max_num) 
     tries += 1 

    print('number of tries out of %s : %s ' % (max_num, tries)) 
    total_tries += tries 
    i += 1 
    tries = 0 

print("Average tries: %s" % (total_tries/iterations)) 
+1

これはまだ複雑です。私の答えを見てください。 –

1

あなたの論理は非常に奇妙です。

  • ループから脱出するために人工的なセンチネル値を使用したくないです。ちょうど明白にそれから抜け出す。

  • 基本的には、試行を繰り返す回数と、試行に必要な試行回数を確認する2つのループがあります。その構造を隠さないでください。

  • if/else ifですべてのケースをカバーしないでください。それはelseのためです。

  • ループ内で、後でではなく、テストする前に数値を生成します。そうすれば、あなたは何をしているのかがはっきりし、ループの前に余分な世代を必要としません。同様に、一番下のループではなく、一番上のループで値を再初期化します。

  • 明確な変数名を使用してください。意味のある変数名がない場合は、変数を作成しないでください。結果を比較するには、実際には2つの変数をrandom.randrange(0, b)に設定する必要はありません。あなたが論理を単純化し、random.randrange(0, b)の一見奇妙な比較を書くのを避けたいのであれば、あなたは注意することができます(そして、この種のものにプログラムを書くのに十分興味があるかどうかを証明できるはずです)。任意の目標値を選択して同じ結果を得ることができます。また、変数を使用して、任意に選択した数値定数に名前を付けます。

  • +=をPythonで使用すると、変数を更新できます。

  • 印刷書式を使用します。


import random 
range_size = 20 
total = 0 
iterations = 1000 # or however many 

for trial in xrange(iterations): 
    attempts = 0 
    while random.randrange(0, range_size) != 0: attempts += 1 
    print "Trial #{0}: Took {1} tries to match one of {2} numbers.".format(
     trial, attempts, range_size 
    ) 
    total += attempts 

print "Average trials: {0}".format(float(total)/iterations) 

デバッグ情報を必要としない場合は、私たちも、クリーナー、加算を行うための組み込み関数を使用して、私たちのためのロジックをループすることで、物事を行うことができます。

from random import randrange 
from itertools import * 
range_size = 20 
total = 0 
iterations = 1000 # or however many 

print "Average trials: {0}".format(sum(
    sum(takewhile(lambda x: randrange(0, range_size) != 0, repeat(1))) 
    # I tested that way, but this is probably more logical 
    # even if it's more verbose: 
    # len(list(takewhile(
    #  lambda x: x != 0, 
    #  imap(randrange, repeat(0), repeat(range_size)) 
    #))) 
    # 'lambda x: x != 0' can also be spelled 'bool' in this context, 
    # but explicit is better than implicit... 
    for i in xrange(iterations) 
)/float(iterations)) 
+0

'while random.randrange(0、range_size)!= 0:' - そうです、それは良い方法です。 –

関連する問題