当随机值是介于0和1之间的浮点数时(例如AS3或JavaScript中的Math.random()
),以下哪个选项会给出恰好50%的概率? 我已经看到它们在实践中都被使用:
if (Math.random() > 0.5) ...
if (Math.random() >= 0.5) ...
注意: 我在这里有点追求严谨,因为实际上,命中 0.5
的概率极其低。不过,我仍然想知道 0 包含
和 1 不包含
的中间位置在哪里。
当随机值是介于0和1之间的浮点数时(例如AS3或JavaScript中的Math.random()
),以下哪个选项会给出恰好50%的概率? 我已经看到它们在实践中都被使用:
if (Math.random() > 0.5) ...
if (Math.random() >= 0.5) ...
注意: 我在这里有点追求严谨,因为实际上,命中 0.5
的概率极其低。不过,我仍然想知道 0 包含
和 1 不包含
的中间位置在哪里。
从数学角度来说,一个旨在将区间[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明显相差无几,但仍然不同。
两者是相同的。因为你永远不会得到 Math.random() === 0.5
请尝试这个测试:
while (Math.random() !== 0.5) {}
这个循环是无限的。
0.5
完全不存在。也许您可以扩展您的回答,定义不出现此数字的情况和/或语言,并说明在这些情况下统计数据会发生什么变化,甚至提示其他在给定范围内不存在的数字以及其对预期的 50:50 分配应有的总体影响... - abiessu
[0,1)
的确切中间可以通过if (Math.random() >= 0.5) ...
来实现。但是,无法创建一个完美地将(0,1)
或[0,1]
分割的测试... - abiessu[0..0.49]
是50个数字,而[0.5..0.99]
是50个数字。 - abiessuMath.random
从单位区间上真正的均匀分布中抽取,则P(Math.random() > 0.5) = P(Math.random() >= 0.5) = 0.5
。 - crf