Я считаю, что вы неправильно эти сообщения. Тот, который вы связали, по сути говорит, что вы не должны использовать random.nextInt() % max
, что действительно предвзято; поэтому этот подход очень наивен. Однако, если вы посмотрите на документацию или исходный код Javas nextInt(max)
, то он is более умный. Возможно достаточно непредвзято для вас. Просто узнайте больше о Java API, у него много функциональности ...
В этом примере подробно генерирует один бит непредвзято, не несмещенной двойной случайной между 0 и 1!
Я не уверен, что случайный генератор Java в значительной степени предвзято в том, как вас беспокоят. Но это, безусловно, не качественное случайное, потому что для большинства пользователей оно должно быть fast. Если вы хотите, чтобы высокая энтропия была случайной, попробуйте использовать высококачественные случайные источники вашей операционной системы.
В любом случае, если вы хотите случайное число от 0 до 7 , используя метод, связанный с вашего поста (!, Который, вероятно, является общей избыточна), сделайте следующее:
int bit1 = generateOneBitOfRandom();
int bit2 = generateOneBitOfRandom();
int bit3 = generateOneBitOfRandom();
int zerotoseven = (bit1 << 2) + (bit2 << 1) + bit3;
// Probably at least as good is the proper Java API:
Random random = new Random();
int zerotoseven2 = random.nextInt(8);
Опять же, скорее всего, java.util.Random nextInt(8)
будет достаточно для вас. Если вы не выполняете криптографию. Тогда вам действительно стоит просто прочитать байт от /dev/random
, который может иметь доступ к пулу энтропийного оборудования, если ваш процессор или материнская плата имеют такие функции (просто надеюсь, что один из них не смещен/смещен). Скорее всего, что делает Javas SecureRandom
. Опять же пример того, что Java API, вероятно, гораздо умнее, чем вы думаете.
Вместо этого вы посмотрели на 'java.util.Random'? –
@JonSkeet документация 'Math.random()' говорит: «Когда этот метод сначала вызывается, он создает один новый генератор псевдослучайных чисел, точно так же, как если бы выражение new java.util.Random« –
@JonSkeet. уверен, что это беспристрастно? –