srand() + rand() 具有局部作用域
srand() + rand() with local scope
我有一个调用 srand 和 rand 的函数,如下所示:
void foo() {
int seed = some_operation();
std::srand(seed);
int value = std::rand();
// Do something with random value
}
但是,我不想更改 rand 的全局状态。那么获取随机数最简单的方法是什么?
要求:
- 随机数必须是基于种子的确定性
- C++11 没问题
- foo 应该是线程安全的
- 不应修改 rand 的全局状态
编辑:
有一个 Whosebug question asking how to generate random numbers. The accepted answer 但是显示了如何使用缓慢的 std::random_device 生成真正唯一的随机数。我只需要一个使用固定种子的简单生成器。
<random>
定义了一些您可以使用的 PRNG 类,它们不使用全局状态。
例如,使用默认的 Mersenne Twister,std::mt19937
:
#include <iostream>
#include <random>
int main() {
int seed = 1234;
std::mt19937 rng(seed);
std::cout << "Random number: " << rng() << std::endl;
}
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()
通常使用的引擎,但其状态封装在 class 中。如果您需要更高质量的伪随机序列,也可以使用其他引擎。如果您没有特定要求,Mersenne Twister std::mt19937
通常是一个不错的选择。
一种方法是使用自己的种子数据提供您自己的实现。 manpage for rand().
中提供了执行此操作的模板
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}
我有一个调用 srand 和 rand 的函数,如下所示:
void foo() {
int seed = some_operation();
std::srand(seed);
int value = std::rand();
// Do something with random value
}
但是,我不想更改 rand 的全局状态。那么获取随机数最简单的方法是什么?
要求:
- 随机数必须是基于种子的确定性
- C++11 没问题
- foo 应该是线程安全的
- 不应修改 rand 的全局状态
编辑:
有一个 Whosebug question asking how to generate random numbers. The accepted answer 但是显示了如何使用缓慢的 std::random_device 生成真正唯一的随机数。我只需要一个使用固定种子的简单生成器。
<random>
定义了一些您可以使用的 PRNG 类,它们不使用全局状态。
例如,使用默认的 Mersenne Twister,std::mt19937
:
#include <iostream>
#include <random>
int main() {
int seed = 1234;
std::mt19937 rng(seed);
std::cout << "Random number: " << rng() << std::endl;
}
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()
通常使用的引擎,但其状态封装在 class 中。如果您需要更高质量的伪随机序列,也可以使用其他引擎。如果您没有特定要求,Mersenne Twister std::mt19937
通常是一个不错的选择。
一种方法是使用自己的种子数据提供您自己的实现。 manpage for rand().
中提供了执行此操作的模板static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}