随机数发生器过于频繁地重复某些数字

Dan*_*son 1 arrays random math generator go

我正在写一个彩票抽奖模拟程序作为一个项目.游戏的工作方式是你需要选择从49中抽取的6个数字才能获胜.

你获胜的机会是1/13,983,816,因为这是49个中有6个的组合.将demo program on Go playground 产生围绕循环下去,每次六个新的号码.

每次生成一组新的数字时,我都会测试它是否已经存在,如果确实存在,我就会突破循环.对于13,983,816种组合,您会认为在相同的6个数字重复之前需要很长时间,但在测试中它总是在10000次迭代之前失败.有谁知道为什么会这样?

Sal*_*ali 7

在我看来,你有几个问题.

  1. 你使用Go操场,你的随机性是固定的.这条线rand.Seed(time.Now().UnixNano())总是产生相同的种子,因为time.Now()它是相同的.
  2. 您可以使用模拟测试完全不同的东西.我最后会写一下.
  3. 如果你想做类似于赌博的事情 - 你必须使用加密安全的PRNGGo拥有它.如果你想要你可以在这里阅读更多细节(答案是php问题,但它解释了差异).

关于概率部分:

赢得彩票的可能性确实如此1/C(49, 6) = 1/13,983,816.但这是某人选择已经预定义的数字的概率.例如,你声称你的赢家是{1, 5, 47, 3, 4, 5},现在有人赢得的概率大约是14万分之一.所以你必须做以下事情.随机选择一组6个数字,然后将循环中的新选择与已找到的数字进行比较.

但你要做的是检查碰撞的概率.有N个人中的一些会选择相同的集合(甚至不一定是获胜集合).这被称为生日悖论.正如你所看到的那样,碰撞的概率随着人数N的增加而急剧增加.

这绝对是同样的问题,但你一年中的天数是多少,13,983,816你可以在这里查看,在这个天数里,你只需要5000次迭代就可以保证0.59%你会发生碰撞.通过9000次迭代,您将发现概率为0.94的碰撞.