Справедливо увеличить размер набора случайных чисел?

Вопрос по математике/программированию, который возник, когда я пытался использовать набор случайных данных в качестве источника энтропии. В ситуации, когда я использую что-то вроде предварительно созданных случайных файлов от Random.org в качестве источника энтропии. Необработанные данные, подобные этому, представляют собой случайные нули и единицы и могут быть отбиты как случайные байты (0-255) или более крупные диапазоны как степени двойки. Я пытаюсь максимально эффективно использовать этот случайный источник, поскольку он имеет конечную длину, поэтому я не хочу использовать больший набор, чем мне нужно.

Взятие случайных байтов справедливо, если вы хотите получить число из диапазона, без остатка кратного 256 (например, от 100 до 355, от 0 до 15 и т. д.). Однако что, если я хочу число от 1 до 100? Это не очень хорошо вписывается в 256. Я мог бы назначить 0-199 диапазону 1-100 дважды, оставив 200-255 как лишние, которые нужно было бы отбросить, если бы они выпали, иначе 55 чисел в диапазоне были бы несправедливо взвешены. приходить чаще.

Является ли выбрасывание чисел, выходящих за пределы допустимого диапазона, единственным справедливым вариантом? Или есть математический способ «размыть» эти 55 чисел в диапазоне от 1 до 100?

Единственный другой вариант, который я придумал, чтобы знать, что я смогу использовать число и не выбрасывать результаты, - это поглотить большее количество байтов, чтобы степень смещения была меньше (0-255 будет иметь некоторые числа в 1-100 с двумя «ничьими», а некоторые с тремя; шансы 3: 2 = 50% более вероятны. Десять байтов (0-2550) будут иметь шансы 26:25 = 4% более вероятные и т. д.) Это израсходует больше данных, но более предсказуемо.

Есть ли термин для того, что я пытаюсь сделать (не могу найти в Google то, что не могу назвать)? Возможно ли это, или я должен признать, что мне придется отбрасывать данные, которые не совсем соответствуют тому диапазону, который я хочу?


person MidnightLightning    schedule 03.06.2013    source источник


Ответы (1)


Если вы используете 7 бит на число, вы получите 0-127. Всякий раз, когда вы получаете число больше 100, вы должны отбросить его. Вы теряете возможность использовать эту точку данных, но она по-прежнему случайна. Вы теряете 28 из каждых 128 или около 20% случайной информации.

Если вы используете 20 бит сразу, вы получите число от 0 до 1 048 575. Его можно разбить на 3 случайных значения от 0 до 99 (или от 1 до 100, если добавить к нему 1). Вы должны использовать целочисленную арифметику или отбрасывать любую дробную часть при делении.

if (number > 1000000) discard it.
a = number % 100;
b = (number / 100) % 100;
c = (number / 10000) % 100;

Вы теряете только 48 575 значений из 1048575 или около 5% случайной информации.

Вы можете думать об этом процессе таким образом. Возьмите число, которое вы получите, преобразовав 20 бит в десятичное целое число. Выделите цифры 10 и 1, цифры 1000 и 100, а также цифры 100 000 и 10 000 и используйте их как три случайных числа. Они действительно случайны, поскольку эти цифры могут быть любым значением в исходном числе. Кроме того, мы отбросили любые значения, которые искажают определенные значения из трех.

Так что есть способ более эффективно использовать случайные биты. Но вы должны сделать некоторые вычисления.

Примечание. Следующей интересной комбинацией битов является 27 бит, и это тратит около 25%. 14 бит потеряют около 60%.

person Lee Meador    schedule 03.06.2013
comment
Это меньше тратится впустую, хотя это полезно только в том случае, если вам нужно несколько розыгрышей в одном и том же диапазоне (в вашем примере 3 розыгрыша на 0-100). Фактическое использование, которое я применяю, - это перетасовка Фишера-Йейтса, поэтому используемый диапазон постоянно меняется. Но это все еще могло бы работать, если бы различные диапазоны можно было сгруппировать таким образом. - person MidnightLightning; 04.06.2013
comment
Просто добавьте ведро, куда вы поместите три числа, когда будете их вычислять. Код с использованием чисел может либо получить один из ведра, либо вызвать калькулятор, а затем получить его. - person Lee Meador; 04.06.2013