掷两个骰子结果相同的几率似乎比我想象的更常见
Odds of rolling two dice with equal outcomes seem more common than I pictured
运行多次调用此程序后,我发现我的 y 值每次都在 60-80 之间。
我想因为 70^2 是 4900,所以我最终会得到我的 y 值每个 运行 大约 1,但实际上它大约有 70 分之一的机会骰子彼此相等。
那么为什么掷 2 个 70 面的骰子并且结果彼此相等不是 1/4900 的机会,而是 1/70 的机会?这是程序...
x=0
y=0
while x < 4900
random = rand(70)
random2 = rand(70)
puts " "
puts random
puts random2
if random == random2
puts "the numbers matched"
y+=1
end
x+=1
if x == 4900
puts " "
puts y
end
end
有 4900 种可能的结果(1,1), (1,2), (1,3) .. ,(70, 70)
有 70 个结果符合您的条件 - (1,1), (2,2) .. (70,70)
所以,概率是 needed_outcomes/all_outcomes = 70/4900 = 1/70 ~= 0.0142858
在测试程序中,测试数量与结果数量无关。更多的测试往往会显示更准确的结果(在这种情况下我们根本不编程,但问题中有 ruby 标记)。
所以,我们可以试试这个:
x=0
total_matches = 0.0
N = 1000000
while x < N
random = rand(1..70)
random2 = rand(1..70)
total_matches += 1 if random == random2
x += 1
end
puts total_matches/N
它给出了大约 0.0142。
如果您希望通过模拟掷出来估计两个掷出的 70 面骰子显示相同值(我们知道是 (1.0/70).round(6) #=> 0.014286
)的概率,您可以假设一个骰子始终显示相同的给定值重复投掷第二颗骰子,计算它显示第一颗骰子的假定值的次数,然后将计数除以投掷次数。 (请参阅我对该问题的评论。)
假设每个骰子的侧面都标有 0
、1
、...、69
,我们假设第一个骰子总是显示 0
。然后我们可以模拟如下:
def simulate(nbr_throws)
nbr_throws.times.sum { rand(70) == 0 ? 1 : 0 }.fdiv(nbr_throws).round(6)
end
simulate( 100) #=> 0.01
simulate( 1_000) #=> 0.016
simulate( 10_000) #=> 0.0151
simulate( 100_000) #=> 0.01358
simulate( 1_000_000) #=> 0.014305
simulate( 10_000_000) #=> 0.014282
simulate(100_000_000) #=> 0.014284
参见 Kernel#rand and Integer#fdiv。更一般地说,如果每个骰子有 n
面,将 rand(70)
更改为 rand(n)
。
运行多次调用此程序后,我发现我的 y 值每次都在 60-80 之间。
我想因为 70^2 是 4900,所以我最终会得到我的 y 值每个 运行 大约 1,但实际上它大约有 70 分之一的机会骰子彼此相等。
那么为什么掷 2 个 70 面的骰子并且结果彼此相等不是 1/4900 的机会,而是 1/70 的机会?这是程序...
x=0
y=0
while x < 4900
random = rand(70)
random2 = rand(70)
puts " "
puts random
puts random2
if random == random2
puts "the numbers matched"
y+=1
end
x+=1
if x == 4900
puts " "
puts y
end
end
有 4900 种可能的结果(1,1), (1,2), (1,3) .. ,(70, 70)
有 70 个结果符合您的条件 - (1,1), (2,2) .. (70,70)
所以,概率是 needed_outcomes/all_outcomes = 70/4900 = 1/70 ~= 0.0142858 在测试程序中,测试数量与结果数量无关。更多的测试往往会显示更准确的结果(在这种情况下我们根本不编程,但问题中有 ruby 标记)。
所以,我们可以试试这个:
x=0
total_matches = 0.0
N = 1000000
while x < N
random = rand(1..70)
random2 = rand(1..70)
total_matches += 1 if random == random2
x += 1
end
puts total_matches/N
它给出了大约 0.0142。
如果您希望通过模拟掷出来估计两个掷出的 70 面骰子显示相同值(我们知道是 (1.0/70).round(6) #=> 0.014286
)的概率,您可以假设一个骰子始终显示相同的给定值重复投掷第二颗骰子,计算它显示第一颗骰子的假定值的次数,然后将计数除以投掷次数。 (请参阅我对该问题的评论。)
假设每个骰子的侧面都标有 0
、1
、...、69
,我们假设第一个骰子总是显示 0
。然后我们可以模拟如下:
def simulate(nbr_throws)
nbr_throws.times.sum { rand(70) == 0 ? 1 : 0 }.fdiv(nbr_throws).round(6)
end
simulate( 100) #=> 0.01
simulate( 1_000) #=> 0.016
simulate( 10_000) #=> 0.0151
simulate( 100_000) #=> 0.01358
simulate( 1_000_000) #=> 0.014305
simulate( 10_000_000) #=> 0.014282
simulate(100_000_000) #=> 0.014284
参见 Kernel#rand and Integer#fdiv。更一般地说,如果每个骰子有 n
面,将 rand(70)
更改为 rand(n)
。