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

时间:2016-01-31 22:28:43

标签: arrays math random go generator

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

你获胜的机会是1 / 13,983,816,因为这是49个中有6个组合的数量。 demo program on Go playground 每次在循环中产生六个新数字。

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

3 个答案:

答案 0 :(得分:7)

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

  1. 你使用Go操场,你的随机性是固定的。此行rand.Seed(time.Now().UnixNano())始终生成相同的种子,因为time.Now()是相同的。
  2. 您可以使用模拟测试完全不同的内容。我最后会写一下。
  3. 如果你想做类似赌博的事情 - 你必须使用cryptographically secure PRNGGo has it。如果你想要,你可以阅读more details here(答案是php问题,但它解释了差异)。
  4. 关于概率部分:

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

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

    这绝对是同样的问题,但你一年中的天数是13,983,816,你可以check here在这几天你只需要5000次迭代来保证0.59%你会发生碰撞。通过9000次迭代,您将发现碰撞概率为0.94。

答案 1 :(得分:2)

我相信你正在解决一个不同的问题,两个相同的抽签出现的可能性远高于一个特定的抽奖。

这称为Birthday Problem

答案 2 :(得分:0)

顺便说一下,对于生日悖论来说,一个粗略的经验法则是,如果你有N天,你需要迂回的sqrt(N)人来获得碰撞的好机会(大约50%)。

所以,对于原始的生日悖论,你有365天,所以经验法则给你365 ^ .5或大约19个人你已经有一个不错的碰撞机会(真正的答案为> 50%: 23人)。

在这里,有了13,983,816种可能的结果,经验法则告诉你,有3739次平局你很有可能发生碰撞(50%的真实答案:4400次抽签)。