如何确保获得50%的胜率?

28

当随机值是介于0和1之间的浮点数时(例如AS3或JavaScript中的Math.random()),以下哪个选项会给出恰好50%的概率? 我已经看到它们在实践中都被使用:

if (Math.random() > 0.5) ...
if (Math.random() >= 0.5) ...

注意: 我在这里有点追求严谨,因为实际上,命中 0.5 的概率极其低。不过,我仍然想知道 0 包含1 不包含 的中间位置在哪里。


3
如果“地板”包含在内而“天花板”不包含,则逻辑上“>=0.5”。 - Matt Way
1
[0,1) 的确切中间可以通过 if (Math.random() >= 0.5) ... 来实现。但是,无法创建一个完美地将 (0,1)[0,1] 分割的测试... - abiessu
如果观察值大于等于0.5,则其会变成51-49。因此,恰好50%的情况会大于0.5。 - Works On Mine
2
@Scrooj:实际上恰恰相反...注意 [0..0.49] 是50个数字,而 [0.5..0.99] 是50个数字。 - abiessu
2
这将取决于生成随机数的过程。如果 Math.random 从单位区间上真正的均匀分布中抽取,则 P(Math.random() > 0.5) = P(Math.random() >= 0.5) = 0.5 - crf
显示剩余6条评论
2个回答

49

从数学角度来说,一个旨在将区间[0,1)(使用[表示“包含”,)表示“不包含”)准确地分成50-50比例的测试将使用类似以下的比较:

if (Math.random() >= 0.5) ...

这是因为它将初始区间[0,1)平均分成两个区间[0,0.5)[0.5,1)

相比之下,测试

if (Math.random() > 0.5) ...

将区间分成[0,0.5](0.5,1)两部分,长度相等,但前者是包含边界的,后者不包含。

当精度趋近于无穷大时,两个测试中边界是否以相同的方式被包含并不重要,但在所有有限精度情况下,这会产生微小但可测量的差异。

假设精度限制为0.000001(十进制),则>=0.5测试确切地为[0,0.499999][0.5,0.999999],显然可以看出将0.5添加到第一个区间(或从第二个区间中减去)可以使两个区间完全对齐。另一方面,在这种精度下,>0.5测试将区间变为[0,0.5][0.500001,0.999999],这显然是对小于等于0.5的数字不公平的不等区间。事实上,比例是500001:499999,与50:50明显相差无几,但仍然不同。


3
提到精度的注释很好。如果随机数生成被重复进行无数次,"微不足道"的不平衡比例可能会产生影响,这取决于应用(例如赌场/法律/物理学软件等,尽管这些应用程序可能会使用专门的随机数生成器)。JS使用64位浮点数,具有大约15个等效数字的定点精度,所以对于大多数用途来说,应该是可以接受的。 - Beejor

0

两者是相同的。因为你永远不会得到 Math.random() === 0.5

请尝试这个测试:

while (Math.random() !== 0.5) {}

这个循环是无限的。


2
请注意,OP提到了JavaScript等内容,但并没有假定具体使用这些语言,也没有假定 0.5 完全不存在。也许您可以扩展您的回答,定义不出现此数字的情况和/或语言,并说明在这些情况下统计数据会发生什么变化,甚至提示其他在给定范围内不存在的数字以及其对预期的 50:50 分配应有的总体影响... - abiessu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接