掷两个骰子结果相同的几率似乎比我想象的更常见

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)的概率,您可以假设一个骰子始终显示相同的给定值重复投掷第二颗骰子,计算它显示第一颗骰子的假定值的次数,然后将计数除以投掷次数。 (请参阅我对该问题的评论。)

假设每个骰子的侧面都标有 01、...、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)