2014-12-02 5 views
2

Я хотел бы иметь 5 случайных чисел для каждого обрабатываемого объекта. Я обрабатываю много объектов (отдельно) и должен убедиться, что случайность достигается по всем числам. Если я обрабатываю 5 объектов, у меня будет 25 случайных чисел:Правильное генерирование случайных чисел

  RN1 RN2 RN3 RN4 RN5 
Object 1 1 2 3 4 5 
Object 2 6 7 8 9 10 
Object 3 11 12 13 14 15 
Object 4 16 17 18 19 20 
Object 5 21 22 23 24 25 

Вопросов:

  • для одного объекта, он делает разницы, если я создаю генератор случайных чисел для каждого числа, используя ток время в миллисекундах в качестве семени или когда я создаю один генератор случайных чисел и получаю серию чисел с использованием nextDouble с точки зрения качества случайности?
  • Как только я обрабатываю несколько объектов и беру все первые случайные числа всех объектов, будут ли они формировать равномерное случайное распределение (например, числа 1, 6, 11, 16, 21), или это будет как-то сломано?

мой взгляд, было бы лучше, чтобы создать один генератор случайных чисел только (общий для всех объектов), так что всякий раз, когда требуется новое случайное число, которое я могу назвать nextDouble() и получить следующее число в последовательности случайных чисел.

ответ

3

Посмотрите на класс ThreadLocalRandom с Java.

Он обеспечивает равномерное распределение и предотвращает узкое место, так как каждый из ваших потоков будет иметь свою собственную копию.

Относительно того, что они имеют разные последовательности, все дело в изменении их семени. Одной из распространенных практик в этом случае является просмотр генератора с помощью идентификатора Thread/Task/Process.

+0

, если вы хотите получить более подробную информацию о том, как обращаться со случайными числами в параллельных/параллельных приложениях на Java, я написал статью об этом: http://onlinelibrary.wiley.com/doi/10.1002/cpe.3214/abstract – jopasserat

+0

бесплатная версия той же бумаги: https://hal.inria.fr/hal-01098598v1 – jopasserat

1

• для одного объекта, он делает разницы, если я создаю случайные генератора чисел для каждого числа, используя текущее время в миллисекундах как семена или когда я создаю один генератор случайных чисел и получить ряд чисел, используя nextDouble с точки зрения качества случайности?

Не используйте текущее время в качестве семени для каждого номера. Генерация занимает меньше времени, чем разрешение текущего времени в миллисекундах.

+0

Это очень плохая практика использования одного генератора, поскольку он не только станет узким местом, если приложение масштабируется, но и не гарантирует, что результаты воспроизводимы, поскольку вы не можете прогнозировать порядок, в котором потоки будут доступны генератор. это зависит от политики планирования ОС – jopasserat

+0

@jopasserat Отредактировано, чтобы подчеркнуть то, что я действительно хотел сделать, а это не использовать текущее время как семя для каждого вызова. – kutschkem

+0

этот пункт стоит упомянуть. Хотя мы не знаем, ожидает ли ОП воспроизводимости. Для игры это может быть хорошо. – jopasserat

1

Самый безопасный способ состоит в том, чтобы предварительно сгенерировать необходимое количество случайных чисел, сохранить его в массиве и установить правила порядка доступа. Таким образом, вы полностью контролируете процесс. Также нет «потери случайности».

В противном случае, если вы запускаете сразу несколько генераторов, они, скорее всего, будут засеяны с одинаковым значением (по умолчанию системное время), и если вы используете одиночный генератор, к которому одновременно подключены разные потоки, вам необходимо передать объект Random класс, который может быть хорошим, но также может привести к потере воспроизводимости (я не уверен, если это имеет решающее значение в вашем случае).

Смежные вопросы