c++ - srand() + rand() 局部作用域

标签 c++ c++11 random scope thread-safety

我有一个调用 srandrand 的函数,如下所示:

void foo() {
   int seed = some_operation();
   std::srand(seed);
   int value = std::rand();
   // Do something with random value
}

但是,我不想更改rand 的全局状态。那么获取随机数最简单的方法是什么?

要求:

  • 随机数必须是基于种子的确定性
  • C++11 没问题
  • foo 应该是线程安全的
  • 不应修改 rand 的全局状态

编辑:

有一个stackoverflow question询问如何生成随机数。接受answer然而展示了如何使用慢速 std::random_device 生成真正唯一的随机数。我只需要一个使用固定种子的简单生成器。

最佳答案

C++11 is fine

然后使用新的pseudorandom number library :

#include <random>

int foo() {
    int seed = some_operation();
    std::minstd_rand rand(seed);
    int value = rand();
    // Do something with random value
}

minstd_rand 是一个简单的线性同余引擎,类似于 std::rand() 通常使用的引擎,但其状态封装在一个类中。如果您需要更高质量的伪随机序列,也可以使用其他引擎。如果您没有特定要求,Mersenne Twister std::mt19937 通常是一个不错的选择。

关于c++ - srand() + rand() 局部作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30484831/

相关文章:

c++ - 在 Windows 2008 R2 SP1 上使用 GetVersionEx 时出现错误行为

c++ - C++迭代搜索混合类型的Map

c# - 从 C# 调用 C++ DLL

c++ - 带有尾随返回类型的 final、override、const 的语法

random - 如何使用 Rust 中的 rand crate 输入整数种子来生成随机数?

Java将两个整数从1到0转换为 double 型

c++ - 使用二维动态数组写一个类

c++ - 为什么 C++11 允许 GC?

c++ - CRTP。试图理解给定的例子

mysql - mysql中行组的随机顺序