我最近學會了the hard way,#<cstdlib> rand()
不是線程安全的,在Linux上用互斥鎖實現,當多線程調用rand()
時造成瓶頸。 rand_r
作爲替代品,但有關於隨機數生成質量的concerns。此外,這種情況讓我質疑是否會有更快的隨機數生成器,因爲顯然我的代碼花費了大量的時間來生成隨機數。上面的鏈接中列出了一些替代方案,但我不確定其速度以及其他替代方案。C++高效計算和線程安全隨機函數
4
A
回答
11
如果您不需要任何統計控制跨越線程,只要使用由<random>
提供的設施:
#include <random>
typedef std:::mt19937 rng_type;
std::uniform_int_distribution<rng_type::result_type> udist(0, 200);
int main() // this can be per thread!
{
rng_type rng;
// seed rng first:
rng_type::result_type const seedval = get_seed();
rng.seed(seedval);
rng_type::result_type random_number = udist(rng);
return random_number;
}
梅森倍捻機PRNG既快速又具有良好的統計特性。在每個線程中維護一個單獨的(並分開播種的)引擎對象,可以避免所有併發問題。
2
在Linux中,您可以以非阻塞的方式從/dev/urandom中讀取。
+3
你不應該使用系統的熵來源*大*隨機性。 'urandom'對於播種很好,但不適用於持續的隨機數生成。就我所知,它甚至沒有明確的分佈。 –
相關問題
- 1. 線程安全隨機數
- 2. c中使用線程安全隨機數的多線程
- 3. C#中OAuth隨機數的線程安全隨機數/字符串生成器
- 4. 可變整數和計算機安全
- 5. C++ 11隨機數生成器的線程安全性
- 6. 如何讓C#線程安全的隨機數發生器
- 7. GSL + OMP:線程安全的隨機數生成器在C++
- 8. 用於C#的快速線程安全隨機數生成器
- 9. C#計時器和線程安全
- 10. Objective-C線程安全計數器
- 11. 線程安全計數器C++ 11
- 12. 按位高效,統一,加密安全的隨機數生成
- 13. C++成員函數線程安全
- 14. 計算隨機數
- 15. C++線程安全和notify_all()
- 16. strtok函數線程安全
- 17. 線程安全和靜態函數
- 18. 隨機函數,計算百分比
- 19. 在C中爲OpenMP使線程安全函數安全
- 20. C#數據源類和線程安全
- 21. C++線程安全整數
- 22. 如何使隨機算法更高效
- 23. C++線程安全的隊列關機
- 24. 隨機置換中第n項的高效計算
- 25. C#多線程安全類設計
- 26. C#線程安全
- 27. Haskell中的隨機數生成器是線程安全的嗎?
- 28. cython的線程安全隨機數生成
- 29. 隨機整數,計算和表格
- 30. 線程安全訪問數組和線程安全訪問
FPA再次,呵呵? ;) –
@ R.MartinhoFernandes:Shhhh .... –
@Kerrek的''使用梅森扭轉者?它的速度與rand()相比如何?此外,新的隨機數如何獲得?我可以重複執行'= random_number',還是每次都必須執行'random_number = udist(rng);' –