<p>用这段代码不能得到两个<code>ones</code>的概率。您的代码(由于<code>while True</code>错误地)所做的是计算从两个<em>独立的</em>骰子中获得任何</em>两个相等结果所需的尝试次数。你知道吗</p>
<p>这个概率可以用简单的概率论来确定。为了得到任何两个相等的结果,<code>p = (1/36) * 6 = 1/6</code>。你知道吗</p>
<p>这意味着,在两个独立骰子的每6次掷骰中,有一次你从每个骰子中得到相同的结果(例如,两个<code>fours</code>或两个<code>sixes</code>)</p>
<p>如果你想用一个算法来发现这个问题,你可以运行一个类似蒙特卡罗的模拟,看看在世界的随机状态下,这种情况预计会发生多少次。你知道吗</p>
<p>使用您自己的算法(稍作修改):</p>
<pre><code>import random
def roll_dice(n, arange):
total_count = 0
for i in range(arange):
total_count +=1
d1, d2 = random.randint(1,n), random.randint(1,n)
if d1 == d2:
break
return total_count
z=[]
s=1000
for i in range(s):
z.append(roll_dice(6, 1000))
>>> np.array(z).mean()
5.916666666666667
# s=100000
>>> np.array(z).mean()
5.9943
</code></pre>
<p>你会看到,正如预期的那样,模拟的数量越多,平均值就越接近6。你知道吗</p>
<hr/>
<p>另外,如果你想找到你所描述的情况的平均值(即找到两个<code>ones</code>出现的概率),你可以改变这一行(它解释了任何两个相等的数)</p>
<pre><code>if d1 == d2:
</code></pre>
<p>对于以下情况(仅说明输出为<code>one</code>的情况):</p>
<pre><code>if d1 == d2 and (d1==1):
</code></pre>
<p>然后,你可以跑去找那个</p>
<pre><code>>>> np.array(z).mean()
35.8479
</code></pre>
<p>和预期的一样,接近<code>36</code>。你知道吗</p>
<p>请注意,如果绘制结果的直方图,结果将不会遵循正态分布:
<a href="https://i.stack.imgur.com/WsBy0.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/WsBy0.png" alt="enter image description here"/></a></p>
<p>这是因为你在分析<code>X*Y</code>等于1的概率,<code>X*Y</code>是两个高斯随机变量的乘积。因此,<code>X*Y</code>的分布不是正态分布,而是遵循这两个变量的<em><a href="https://en.wikipedia.org/wiki/Product_distribution" rel="nofollow noreferrer">product distribution</a></em>(参见<a href="https://math.stackexchange.com/questions/101062/is-the-product-of-two-gaussian-random-variables-also-a-gaussian">here</a>)</p>