Как вы получаете ровно 50% шансов?

Какое из них даст ровно 50% -ный шанс, когда случайным значением является float от 0 до 1 (например, AS3 или JavaScript Math.random())? Я видел, как они использовались на практике:

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

Heads up: Я здесь педантичен, потому что на самом деле удар точно 0.5 является астрономически низким. Тем не менее, мне все равно хотелось бы знать, где находится середина 0 inclusive и 1 exclusive.

Ответы

Ответ 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, но все равно отличается.

Ответ 2

Как насчет Math.floor(Math.random()*2) Это, вероятно, как можно ближе к 50%.