Ответ 1
1...
Это зависит от реализации, но для Java это будет same не так плохо, потому что Java имеет статический уникальный семенной атомный длинный, который каждый раз манипулирует, создается Random. Однако я не удивлюсь другим языкам или реализациям, это не так, и они могут просто использовать системное время (Java также использует системное время, но использует уникальное семя в комбинации). То есть на некоторых системах вы можете получить одно и то же семя для нескольких потоков.
После дальнейшего изучения и некоторого фактического тестирования (хотя и с хрупким тестированием), возможно, я ошибался до, поскольку на самом деле хуже использовать многие (я говорю 100k) генераторы случайных чисел в в то же время (хотя это разные экземпляры). Я не совсем уверен, что его столкновения с семенем или просто факт, что фактическое глобальное приращение семян станет предсказуемым. Конечно, это может быть просто мой тестовый жгут или методология.
Согласно википедии:
Генераторы случайных чисел, особенно для параллельных компьютеров, не должны доверять. [12] Настоятельно рекомендуется проверить результаты моделирования с более чем одним RNG, чтобы проверить, не введен ли предвзятость. Среди рекомендуемых генераторов для использования на параллельном компьютере включают объединенные линейные конгруэнтные генераторы, использующие разделение последовательностей и запаздывающие генераторы Фибоначчи с использованием независимых последовательностей.
Таким образом, теоретически это должно быть лучше, поскольку ThreadLocalRandom создаст независимые последовательности, поэтому, возможно, мое тестирование будет ошибочным.
Это, конечно, основано на псевдо-случайном.
Физическая хаотичность или безопасный случайный генератор, основанный на фактической энтропии, может привести к различиям (то есть больше/меньше энтропии), но я не эксперт, и у меня нет доступа к одному.
2...
Я не могу придумать конкретный вариант использования, но, возможно, вы используете ExecutorService, который постоянно создает и удаляет потоки (предположим, что у них нет контроля над этим), но не так много сразу (т.е. max 2 параллельные потоки). Вы могли бы найти, что ThreadLocalRandom будет стоить дороже, а не создавать единый общий Random.
Еще одна причина и, вероятно, лучшая причина, связанная с вашими комментариями, заключается в том, что вы можете захотеть reset семени для всех процессов. Если у вас есть игра, в которой используются потоки (не многие из них делают, но позволяют делать вид), вы можете захотеть глобальное reset семя для целей тестирования, которое намного проще с AtomicReference to Random, чем попытка передать сообщение всем работающим потокам.
Другая причина, по которой вы, возможно, не захотите использовать ThreadLocalRandom, - это причины платформы. Некоторые платформы имеют особые требования к созданию потоков и, следовательно, созданию потоков. Таким образом, для решения проблемы "у вас есть большая проблема, чем рандомы", зайдите в Google Apps, где:
Java-приложение может создавать новый поток, но есть некоторые ограничения на то, как это сделать. Эти потоки не могут "пережить" запрос, который их создает. (На бэкэнд-сервере приложение может порождать фоновый поток, поток, который может "пережить" запрос, который его создает.)
И чтобы ответить на ваш дополнительный комментарий, почему вы используете ExecutorService, который не может повторно использовать потоки:
или использовать объект factory, возвращенный com.google.appengine.api.ThreadManager.currentRequestThreadFactory() с помощью ExecutorService (например, вызвать Executors.newCachedThreadPool(factory)).
т.е. ThreadPool, который не обязательно повторно использует потоки.