1

现在我有

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

有一个更好的方法吗?

谢谢

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

4

9 回答 9

10

总是有死的简单

硬币=兰特(1);

在许多脚本语言中,这会给你一个介于 0 和你的 arg 之间的随机整数,所以传递 1 会给你 0 或 1(正面或反面)。

于 2009-05-19T01:52:55.057 回答
7

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),它使用不同的方法来生成随机数,如果线性同余生成器会给您带来某种问题。

您可以将这些函数中的任何一个与 < 0.5 测试一起使用,以更有信心获得均匀分布。

于 2009-05-19T03:52:25.103 回答
7

向 xkcd 致敬:

string getHeadsOrTails {
        return "heads"; //chosen by fair coin toss,
                        //guaranteed to be random
    }
于 2009-05-19T04:48:13.007 回答
4

你所拥有的就是我会做的事情。如果 0.0 <= Math.random() < 1.0,这是标准的,那么 (Math.random() < 0.5) 当 Math.random() 在 0.0 和 0.4999 之间时会给你正面...它在 0.5 和 0.999 之间......这是你能得到的最公平的硬币翻转。

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

于 2009-05-19T02:14:45.963 回答
2

在 linux 系统上,您可以从 /dev/random 读取位以获取“更好”的随机数据,但是像 Math.Random() 这样几乎随机的方法对于您能想到的几乎所有应用程序来说都很好,没有严重的密码学工作。

于 2009-05-19T05:07:16.090 回答
0

我不能对人们的帖子发表评论,因为我没有声誉,而只是关于整个 <= vs. < 比尔蜥蜴评论中提到的主题的仅供参考:因为可以有效地假设随机生成之间的任何数字0-1(由于浮点数大小的限制,这在技术上不是这种情况,但在实践中或多或少是正确的) num <= .5 或 num < .5 不会有差异因为在任何连续范围内获得任何一个特定数字的概率都是 0。即:当 X = 0 和 1 之间的随机变量时,P(X=.5) = 0。

于 2009-05-19T04:09:19.980 回答
0

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

于 2009-05-19T01:54:48.627 回答
0

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

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

于 2009-05-19T23:28:36.530 回答
-4

尝试

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

我真的不知道您使用的是什么语言,但如果随机数可被 2 整除,那么它就是正面,如果不是,那么它就是反面。

于 2009-05-19T01:47:56.767 回答