3 回答
TA贡献1859条经验 获得超6个赞
在我看来,你在这里有几个问题。
您使用 Go 游乐场,在那里您的随机性是固定的。这条线
rand.Seed(time.Now().UnixNano())
总是产生相同的种子,因为time.Now()
是相同的。你用你的模拟测试完全不同的东西。我会在最后写下它。
如果你想做一些类似于赌博的事情——你必须使用加密安全的 PRNG并且Go 拥有它。如果您愿意,可以在此处阅读更多详细信息(答案是 php 问题,但它解释了区别)。
在概率部分:
中奖的概率确实是1/C(49, 6) = 1/13,983,816
。但这是某人选择一组已经预定义的数字的概率。例如,您声称您的获胜者是{1, 5, 47, 3, 4, 5}
,现在某人获胜的概率约为 1400 万分之一。因此,您必须执行以下操作。随机选择一组 6 个数字,然后将循环中的新选择与已找到的数字进行比较。
但是你要做的是检查碰撞的概率。有 N 个人,他们中的一些人会选择相同的集合(甚至不一定是获胜的集合)。这就是著名的生日悖论。正如你在那里看到的,碰撞的概率随着人数 N 的增加而急剧增加。
这绝对是相同的问题,但是您一年中的天数是13,983,816
,您可以在此处检查,对于这个天数,您只需要 5000 次迭代即可保证 0.59% 会发生碰撞。通过 9000 次迭代,您会发现碰撞概率为 0.94。
TA贡献1845条经验 获得超8个赞
顺便说一句,生日悖论的粗略经验法则是,如果您有 N 天,则需要迂回的 sqrt(N) 个人来获得良好的碰撞机会(大约 50%)。
所以,对于最初的生日悖论,你有 365 天,所以经验法则告诉你,如果有 365^.5 或大约 19 个人,你就有可能发生碰撞(>50% 的正确答案:23 个人)。
在这里,有 13,983,816 种可能的结果,经验法则告诉您,3739 次平局,您很有可能发生碰撞(50% 的正确答案:4400 次平局)。
- 3 回答
- 0 关注
- 217 浏览
添加回答
举报