Безопасно генерировать случайные числа между некоторыми диапазонами в Java - PullRequest
0 голосов
/ 01 июня 2018

Как мне безопасно создать случайное целочисленное значение в определенном диапазоне?

Я знаю, что многие люди спрашивали об этом раньше, например, этот пост , нометод не кажется безопасным.Позвольте мне объяснить:

В библиотеке 'Math' есть Math.random (), который генерирует случайное значение в диапазоне [0, 1).Используя это, можно построить алгоритм типа int randomInteger = Math.floor(Math.random() * (Integer.MAX_VALUE - Integer.MIN_VALUE + 1) + Integer.MIN_VALUE) для генерации случайного числа между Integer.MAX_VALUE и Integer.MIN_VALUE.Однако Integer.MAX_VALUE - Integer.MIN_VALUE будет переполнено.

Цель состоит не в том, чтобы просто генерировать случайные числа, а в том, чтобы генерировать их равномерно, что означает, что 1 имеет такую ​​же вероятность появления как Integer.MAX_VALUE.Я знаю, что есть обходные пути, такие как приведение больших значений к long, но опять же проблема в том, как сгенерировать длинное целое значение из Long.MIN_VALUE в Long.MAX_VALUE.

Я тоже неуверен в других заранее написанных алгоритмах, поскольку они тоже могут переполниться и привести к изменению распределения вероятностей.Поэтому мой вопрос заключается в том, существует ли математическое уравнение, в котором используются только целые числа (без приведения ни к чему длинному) и Math.random () для генерации случайных чисел от Integer.MIN_VALUE до Integer.MAX_VALUE.Или если кто-нибудь знает какие-либо генераторы случайных чисел, которые не переполняются внутренне?

Спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Случайный x = новый Случайный (1000);// код выполняется и генерирует значения 1000 int i = x.nextInt ();

0 голосов
/ 01 июня 2018

Еще лучше использовать java.security.SecureRandom , который является криптографически сильным генератором случайных чисел (RNG).

0 голосов
/ 01 июня 2018

В библиотеке 'Math' есть Math.random (), который генерирует случайное значение в диапазоне [0, 1).

Так что не используйте Math.random() - используйте это:

Random r = new Random();
int i = r.nextInt();

Документы для nextInt говорят:

nextInt () - Возвращает следующее псевдослучайное, равномерно распределенное значение int из последовательности этого генератора случайных чисел.Все 2 ^ 32 возможных значений int создаются с (приблизительно) равной вероятностью.

Кажется, я немного неправильно понял вопрос, и вам нужно long, а не int - к счастью, контракт тот же.

long l = r.nextLong()

Это в буквальном смысле потребует двух целых и объединит их в один длинный.

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