我最近学会了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);' –