При использовании random какая форма возвращает равный 50% шанс? - PullRequest
9 голосов
/ 26 февраля 2009

Я предполагаю, что большинство встроенных случайных генераторов возвращают что-то вроде этого:

[0.0, 1.0)

поэтому, если бы я хотел получить 50% шанс, я бы использовал что-то вроде этого:

if random() < .5

или что-то вроде:

if random() <= .5

Спасибо за помощь.

Ответы [ 11 ]

13 голосов
/ 26 февраля 2009

Ах, старая проблема ".5". Вот ответ:

Если вы собираетесь разделить 10 вещей на две равные части, вам нужно 5 вещей в каждой части. 0 через 4 в первой части, 5-9 во второй части. Итак ... < .5 правильно.

8 голосов
/ 14 июня 2009

Зачем это делать самостоятельно? Python имеет random.choice:)

random.choice ([0, 1]) даст вам 0/1 с равными шансами - и это стандартная часть Python, написанная теми же людьми, которые написали random.random (и, таким образом, знают больше о его семантика чем кто-либо еще)

4 голосов
/ 26 февраля 2009

В первом приближении либо работает.

Лучший способ - это выбрать генератор случайных чисел, который специально генерирует логические или целые числа с диапазоном. Тогда вы можете точно прибить диапазон.

Операции типа «равенство» с плавающей запятой в любом случае ненадежны.

3 голосов
/ 26 февраля 2009
 if random() < .5

В двоичном формате .5 - это .10000000000 .... Итак, в основном, вопрос сводится к: «Какая первая двоичная цифра после точки радиуса ... 0 (для <.5) или 1 (для .5 или более)?» </p>

1 голос
/ 20 июня 2009
import random
def fifty_fifty():
    "Return 0 or 1 with 50% chance for each"
    return random.randrange(2)
1 голос
/ 26 февраля 2009

Для конкретной системы вы должны протестировать ее, если вы действительно хотите это выяснить. Хотя это может занять некоторое время: -)

Я согласен с другими авторами, что для первого порядка это не имеет значения. Если это имеет значение, вам все равно потребуется более качественный ГСЧ.

РЕДАКТИРОВАТЬ: Я только что попробовал RNG по умолчанию в C # с 1 000 000 000 попыток и ответы были идентичны ...

0 голосов
/ 26 февраля 2009

Если вы собираетесь суетиться из-за своих случайных чисел, не полагайтесь на что-нибудь встроенное. Получите хорошо документированный RNG из места, которому вы доверяете (я верю, что Boost, за что это стоит), и прочитайте документацию. Раньше стандартные ГСЧ были заведомо плохими, и я до сих пор не буду им доверять.

В качестве альтернативы используйте целочисленный ГСЧ, который дает вам дискретные значения в пределах диапазона, и разделите диапазон пополам. ГСЧ, по моему опыту, являются интегральными, а функция с плавающей точкой просто делится на верхнюю часть диапазона.

Конечно, если это правда, у вас есть свой ответ. Если целочисленный ГСЧ выдает 0, 1, 2 и 3, эквивалент с плавающей запятой будет равен 0,0, 0,25, 0,5 и 0,75, поэтому ответом является проверка <0,5. </p>

Если ГСЧ не основан на интегральных вычислениях, то он основан на вычислениях с плавающей запятой и, следовательно, неточен. В этом случае не имеет значения, тестируете ли вы <= или <, поскольку нет гарантии, что вычисление, которое должно быть точным 0,5, будет. </p>

Таким образом, ответ, вероятно, состоит в том, чтобы проверить <0,5, что, вероятно, будет правильным, если оно будет иметь значение. </p>

0 голосов
/ 26 февраля 2009

Если вам нужны действительно случайные числа, вы можете попробовать random.org . Они предлагают веб-сервис, подключенный к устройству, которое обнаруживает шум, исходящий из вселенной. Технически все еще не случайно, но, я думаю, достаточно близко.

У них есть все способы сделать запрос, такие как черно-белые изображения.

0 голосов
/ 26 февраля 2009

Если я хочу 50% -ый шанс, я бы просто проверил LSB (наименее значимый бит).

0 голосов
/ 26 февраля 2009
< .5

, но это предполагает, что ваша поддержка с плавающей запятой достаточно хороша, чтобы удовлетворить ваши требования к точности (поскольку она никогда не точно ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...