Подгонка результатов из PRNG в максимальный минимальный диапазон

#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 и попытаться адаптироваться к реализации