#java
#java
Вопрос:
Я использую PRNG из набора тестов случайности Java Diehard (https://sourceforge.net/projects/jrandtest /). Все алгоритмы имеют 3 метода для извлечения случайных чисел:
readByte()
readInt()
readLong()
Выполнение быстрого цикла алгоритма AES сгенерировало эти числа:
Byte: -102
Int: -252497821
Long: 5882262596119081845
Byte: -68
Int: 1688727157
Long: 436050817787325007
Мне нужно сгенерировать случайные целые числа в диапазоне 0-36 (включительно). Ни один из классов не имеет метода, подобного nextInt(с привязкой к int), который есть у Random() и SecureRandom() . Как я могу поместить число, которое я получаю из PRNG, в нужный мне диапазон? Спасибо!
Ответ №1:
Наивным подходом было бы взять результат readInt() % myMaxValue
, но это приведет к искажению распределений, поскольку в нем используются младшие значащие биты сгенерированных значений (которые, оказывается, имеют наименьшую энтропию).
Прочитайте спецификацию Random.nextInt(int)
, чтобы получить представление о том, как они обходятся. И, конечно же, есть источник openjdk, из которого вы можете черпать вдохновение.
Комментарии:
1. как раз собирался сказать то же самое в отношении чтения grepcode и попытаться адаптироваться к реализации