Я использую один случайный экземпляр для быстрого получения случайных чисел в запросе Parallel
, но я заметил, что в конечном итоге Random.Next
всегда возвращает ноль. Есть ли причина для этого?Random.Next() всегда возвращает 0
ответ
Random
не является потокобезопасным. Вместо этого вы должны использовать другой экземпляр Random
для каждого потока. I не будет предлагать блокировку, как вы предложили, так как в противном случае, если это значительная часть вашего общего времени, она может оказаться не быстрее, чем запустить ее в одном потоке для начала. Вместо этого вы можете использовать локальную переменную потока, чтобы иметь отдельный экземпляр для каждого потока - следя за тем, чтобы вы случайно не использовали одно и то же семя для всех экземпляров, что дало бы вам одну и ту же последовательность чисел в каждом потоке.
См. Мои article on randomness для более подробной информации, включая пример кода.
Хорошая статья в ссылке Jon. Считаете ли вы использование ThreadId для дальнейшего увеличения разделения начальных значений? – Corey
@Corey: Я надеюсь, что последовательные семена не будут иметь никакого очевидного влияния на последовательность случайных чисел. Альтернативой является наличие единственного «ведущего» экземпляра «Случайный», который * * охраняется блокировкой, и использовать это для семени каждого случайного случайного потока. –
Наверное, мне просто нравится добавлять как можно больше энтропии к моим семенам. Это, наверное, глупо, но что-то о последовательных значениях семян делает меня непростым: P – Corey
Random
, по-видимому, не рекомендуется использовать в нескольких потоках одновременно. Блокировка вокруг вызова выглядит следующим образом:
object syncLock = new object();
<snip>
int value;
lock(syncLock){
value = random.Next();
}
, похоже, решил проблему.
Это пахнет _Coding by Coincidence_. –
@AustinSalonen Я рекомендую вам добавить ссылку на эту статью, это выглядит интересно. –
- 1. Random.Next возвращает всегда одинаковые значения
- 2. Разделение на Random.next всегда приводит к 0?
- 3. Почему Random.Next() всегда возвращает тот же номер
- 4. Random.Next() возвращает всегда то же значение
- 5. getUser всегда возвращает 0
- 6. intValue всегда возвращает 0
- 7. Функция всегда возвращает 0
- 8. HttpWorkerRequest.GetBytesRead() всегда возвращает 0
- 9. List.Count всегда возвращает 0
- 10. Resource.getrusage() всегда возвращает 0
- 11. mysql_insert_id() всегда возвращает 0
- 12. XFetchName всегда возвращает 0
- 13. getMaxAmplitude() всегда возвращает 0
- 14. raycaster.intersectObjects возвращает 0 всегда
- 15. searchpair() всегда возвращает 0
- 16. timespec.tv_sec всегда возвращает 0
- 17. Datagridview.selectedrows.count всегда возвращает 0?
- 18. BIO_do_handshake() всегда возвращает 0
- 19. getIdentifier() всегда возвращает 0
- 20. ISALPHA всегда возвращает 0
- 21. GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN всегда возвращает 0
- 22. WEXITSTATUS всегда возвращает 0
- 23. GetPrivateProfileSectionNames всегда возвращает 0
- 24. JQuery всегда возвращает 0
- 25. Grid.GetRow() всегда возвращает 0
- 26. android.applicationVariants.size() всегда возвращает 0
- 27. string.search (".") Всегда возвращает 0
- 28. mysql_insert_id всегда возвращает 0
- 29. stream_copy_to_stream() всегда возвращает 0
- 30. mysql_errno всегда возвращает 0
Random is * not * гарантированно будет потокобезопасным. – user2864740
[Получение случайных чисел потокобезопасным способом] (http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx) –
Вы говорите, что это случайное время, а затем оседает на ноль? –