现在我有
return 'Heads' if Math.random() < 0.5
有更好的方法吗?
由于
编辑:请忽略返回值,“更好”意味着准确的50-50概率。
答案 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
我真的不知道你使用的语言是什么,但是如果随机数可以被两个人分割,那么它就是头部,如果它不是那么它就是尾巴。