2

私はPythonが初めてで、これに頭を悩ませることはできません。次の関数が定義されています。

def FlipCoins(num_flips):
    heads_rounds_won = 0
    for i in range(10000):
        heads = 0
        tails = 0
        for j in range(num_flips):
            dice = random.randint(0,1)
            if dice==1: heads += 1
            else: tails += 1
        if heads > tails: heads_rounds_won += 1
    return heads_rounds_won

すべきことは次のとおりです (ただし、明らかにそうではありません): コインをnum_flip1 回投げ、表と裏を数え、裏よりも表が多いかどうかを確認します。はいの場合、head_rounds_won1 ずつ増やします。10000 回繰り返します。

head_rounds_wonおよそ 5000 (50%)になると思います。そして、入力として奇数に対してそれを行います。たとえば、3、5、または 7 で約 50% が生成されます。ただし、偶数の場合ははるかに低い結果になり、34% 程度になります。特に小さい数値、たとえば 800 のような偶数の大きい数値では、50% までの差ははるかに小さくなります。

これはなぜですか?どの入力も約 50% の表/裏を生成するべきではありませんか?

4

2 に答える 2

9

引き分けのラウンドがたくさんあります

def FlipCoins(num_flips):
    heads_rounds_won = 0
    tails_rounds_won = 0
    tied_rounds = 0
    for i in range(10000):
        heads = 0
        tails = 0
        for j in range(num_flips):
            dice = random.randint(0,1)
            if dice==1: heads += 1
            else: tails += 1
        if heads > tails: heads_rounds_won += 1
        elif heads < tails: tails_rounds_won+= 1
        else: tied_rounds += 1
    return heads_rounds_won, tails_rounds_won, tied_rounds

のようなものを返します

>>> FlipCoins(2)
(2506, 2503, 4991)
于 2012-07-08T03:15:07.537 に答える
0

これは見るのが楽しく、(最終的に) randint(0,1) が 0 または 1 を選択する確率が 50/50 であることを示しています。コミュニティ wiki は有益ですが、質問に対する直接的な回答ではありません。

s = [0, 0]
while True:
    an_int = randint(0, 1)
    s[an_int] += 1
    l = sum(s)
    print 'size: %d - %f%% zeros, %f%% ones' % (l, (100 * s[0]) / float(l), (100 * s[1]) / float(l))
于 2012-07-08T03:19:05.750 に答える