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

现在我有
return 'Heads' if Math.random() < 0.5 
有一个更好的方法吗? 谢谢 编辑:请忽略返回值,“更好”意味着准确的50-50概率。     
已邀请:
死者总是很简单 coin = rand(1); 在许多脚本语言中,这将为你提供0和你的arg之间的随机int,所以传递1给你0或1(头或尾)。     
我们向xkcd致敬:
string getHeadsOrTails {
        return "heads"; //chosen by fair coin toss,
                        //guaranteed to be random
    }
    
C中的Numerical Recipes表示在重要时不要相信内置的随机数生成器。您可以将本书中显示的算法实现为函数ran1(),它声称通过所有已知的随机性统计测试(在1992年),通过少于大约108次调用。 ran1()算法背后的基本思想是在随机数生成器的输出中添加一个shuffle,以减少低阶串行相关。他们使用了“计算机编程艺术第2卷”第3.2-3.3节中的Bays-Durham shuffle,但我猜你也可以使用Fisher-Yates shuffle。 如果你需要更多的随机值,那么同一个文档还提供了一个适用于至少1017个值的生成器(ran2)(我的猜测基于2.3 x 1018的周期)。如果线性同余生成器给你一些问题,它还提供一个函数(ran3),它使用不同的方法生成随机数。 你可以使用&lt;中的任何一个函数。 0.5测试更加确信您获得了均匀分布。     
你拥有的就是我这样做的方式。如果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()的实现很好。     
在linux系统上,您可以从/ dev / random中读取位以获得“更好”的随机数据,但是像Math.Random()这样几乎随机的方法对于几乎所有您能想到的应用程序都没问题,密码学工作。     
尝试区分奇数和偶数。此外,返回枚举值(或布尔值),而不是字符串。     
我不能评论人们的帖子,因为我没有声誉,只是关于整个&lt; = vs.&lt;的FYI比尔蜥蜴评论中提到的主题:因为可以有效地假设随机生成0-1之间的任何数字(由于浮点数的大小限制,这在技术上并非如此,但或多或​​少是真的在实践中)num&lt; = .5或num&lt; .5因为在任何连续范围内获得任何一个特定数字的概率是0. IE:当X = 0和1之间的随机变量时,P(X = .5)= 0。     
这个问题的唯一真正答案是你不能“保证”概率。如果你考虑一下,真正的硬币翻转不能保证50/50概率,它取决于硬币,翻转它的人,以及硬币是否掉落并滚过地板。 ;) 关键是它“足够随机”。如果您正在模拟硬币翻转,那么您发布的代码就更好了。     
尝试
return 'Heads' if Math.random() * 100 mod 2 = 0
我真的不知道你使用的语言是什么,但是如果随机数可以被两个分割,那么它就是头部,如果它不是那么它就是尾巴。     

要回复问题请先登录注册