我正在编写一个彩票抽奖模拟程序作为一个项目。游戏的工作方式是你需要从49中抽取6个数字才能获胜。
你获胜的机会是1 / 13,983,816,因为这是49个中有6个组合的数量。 demo program on Go playground 每次在循环中产生六个新数字。
每次生成一组新数字时,我都会测试它是否已经存在,如果确实存在,我就会突破循环。对于13,983,816种组合,您会认为在相同的6个数字重复之前需要很长时间,但在测试中它总是在10000次迭代之前失败。有谁知道为什么会这样?
答案 0 :(得分:7)
在我看来,你有几个问题。
rand.Seed(time.Now().UnixNano())
始终生成相同的种子,因为time.Now()
是相同的。关于概率部分:
赢得彩票的概率确实是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)
我相信你正在解决一个不同的问题,两个相同的抽签出现的可能性远高于一个特定的抽奖。
答案 2 :(得分:0)
所以,对于原始的生日悖论,你有365天,所以经验法则给你365 ^ .5或大约19个人你已经有一个不错的碰撞机会(真正的答案为> 50%: 23人)。
在这里,有了13,983,816种可能的结果,经验法则告诉你,有3739次平局你很有可能发生碰撞(50%的真实答案:4400次抽签)。