你有更好的想法来模拟硬币翻转吗?

时间:2009-05-19 01:45:46

标签: math random coin-flipping

现在我有

return 'Heads' if Math.random() < 0.5 

有更好的方法吗?

由于

编辑:请忽略返回值,“更好”意味着准确的50-50概率。

9 个答案:

答案 0 :(得分:9)

总有那么简单的

coin = rand(1);

在许多脚本语言中,这将为你提供0和你的arg之间的随机int,所以传递1给你0或1(头或尾)。

答案 1 :(得分:7)

Numerical Recipes in C表示在重要时不要相信内置的随机数生成器。您可以将本书中显示的算法实现为函数ran1(),它声称通过所有已知的随机性统计测试(在1992年),通过少于约10次 8 调用。

ran1()算法背后的基本思想是在随机数发生器的输出中添加一个shuffle,以减少低阶串行相关。他们使用了“计算机编程艺术第2卷”第3.2-3.3节中的Bays-Durham shuffle,但我猜你也可以使用Fisher-Yates shuffle

如果你需要更多的随机值,那么同一个文档还提供了一个生成器(ran2),它应该对至少10个 17 值有好处(我的猜测基于2.3 x 10的时间段) 18 )。如果线性同余生成器给你一些问题,它还提供一个函数(ran3),它使用不同的方法生成随机数。

您可以使用&lt;中的任何一种功能。 0.5测试更加确信你得到了统一的分布。

答案 2 :(得分:7)

向xkcd致敬:

string getHeadsOrTails {
        return "heads"; //chosen by fair coin toss,
                        //guaranteed to be random
    }

答案 3 :(得分:4)

你拥有的是我的方式。如果0.0&lt; = Math.random()&lt; 1.0,作为标准,那么(Math.random()&lt; 0.5)将在Math.random()介于0.0和0.4999之间时给你头,并且当它在0.5和0.999之间时尾巴...这就是你可以得到一个硬币翻转。

当然,我假设Math.random()的实现很好。

答案 4 :(得分:2)

在Linux系统上,您可以读取/ dev / random中的位以获得“更好”的随机数据,但是像Math.Random()这样的几乎随机的方法几乎可以用于您能想到的每个应用程序,缺乏严肃的加密工作。

答案 5 :(得分:0)

尝试区分奇数和偶数。此外,返回枚举值(或布尔值),而不是字符串。

答案 6 :(得分:0)

我无法对人们的帖子发表评论,因为我没有声誉,只是关于整个&lt; = vs.&lt;的FYI Bill中提到的主题Lizard的评论:因为可以有效地假设随机生成0-1之间的任何数字(由于浮点数的大小限制,这在技术上并非如此,但或多或​​少是真的在实践中)num&lt; = .5或num&lt; .5因为在任何连续范围内得到任何一个特定数字的概率是0. IE:当X = 0到1之间的随机变量时,P(X = .5)= 0。

答案 7 :(得分:0)

这个问题唯一真正的答案是你不能“保证”概率。如果你考虑一下,真正的硬币翻转不能保证50/50概率,它取决于硬币,翻转它的人,以及硬币是否掉落并滚过地板。 ;)

关键是它“足够随机”。如果您正在模拟硬币翻转,那么您发布的代码就更好了。

答案 8 :(得分:-4)

尝试

return 'Heads' if Math.random() * 100 mod 2 = 0

我真的不知道你使用的语言是什么,但是如果随机数可以被两个人分割,那么它就是头部,如果它不是那么它就是尾巴。