2

演習として、同じ数字の 5 つのサイコロを振る確率を計算するプログラムを書いています。アイデアは、単純な数学とは対照的に、シミュレーションを介して結果を取得することです。私のプログラムはこれです:

# rollFive.py

from random import *

def main():
    n = input("Please enter the number of sims to run: ")
    hits = simNRolls(n)
    hits = float(hits)
    n = float(n)
    prob = hits/n
    print "The odds of rolling 5 of the same number are", prob

def simNRolls(n):
    hits = 0
    for i in range(n):
        hits = hits + diceRoll()
    return hits


def diceRoll():
    firstDie = randrange(1,7,1)
    for i in range(4):
        nextDie = randrange(1,7,1)
        if nextDie!=firstDie:
            success = 0
            break
        else:
            success = 1
    return success

問題は、n の値を 1 000 000 にしてこのプログラムを実行すると、通常は 0.0006 から 0.0008 の間の確率が得られることですが、私の数学では、0.0001286 (別名 (1/6)^5) に近い答えが得られるはずだと思い込んでしまいます。 .

プログラムに何か問題がありますか? それとも、ここで数学で基本的な間違いを犯していますか? それとも、プログラムをより多くの反復で実行できた場合、結果がより正しい答えに近づくことがわかりますか?

4

4 に答える 4

6

特定の数字が 5 回出る確率は (1/6)^5 ですが、5 つの数字が同じになる確率は (1/6)^4 です。

これを確認するには 2 つの方法があります。

まず、たとえば、すべてが 1 になる確率は (1/6)^5 です。1 になる方法は 6 つのうち 1 つしかないためです。これに 5 つのサイコロを掛けると、(1/6)^5 になります。 . ただし、同じ値を得るには 6 つの可能な数字があるため、成功する方法は 6 つあり、6((1/6)^5) または (1/6)^4 です。

別の見方をすると、最初のロールが何を与えるかは問題ではないので、除外します。次に、その数を残りの 4 つのロールと一致させる必要があり、その確率は (1/6)^4 です。

于 2009-09-24T01:52:56.377 に答える
1

非常に簡単に言えば、6 ** 55 つのサイコロを振って結果が出る可能性があり、そのうち 6 つだけが成功するので、答えは次のようになります。6.0 / 6 ** 5

于 2009-09-24T11:25:15.520 に答える
1

あなたの計算は間違っています。同じ数字のサイコロを5個出す確率は6*(1/6)^5 = 0.0007716.

于 2009-09-24T01:53:33.077 に答える
0

あなたが問題を述べたように、あなたの予想される確率は間違っていると思います。(1/6)^5 は、ある特定の数字が 5 回連続して出る確率です。(1/6)^4 は、任意の数字が 5 回連続して出る確率です(最初のロールは常に「成功」​​するためです。つまり、最初のロールは常に何らかの数字になるためです)。

>>> (1.0/6.0)**4
0.00077160493827160479

100 万回の反復でプログラムを実行する場合と比較します。

[me@host:~] python roll5.py 
Please enter the number of sims to run: 1000000
The odds of rolling 5 of the same number are 0.000755
于 2009-09-24T01:57:29.467 に答える