【发布时间】:2012-01-29 11:31:26
【问题描述】:
我想以不使用标准 rand() 和 srand(time(NULL)) 方法的方式在 C++ 中生成介于 0 和 1 之间的统一随机数。这样做的原因是,如果我在时钟的同一秒内多次运行应用程序,种子将完全相同并产生相同的输出。
我不想依赖 boost 或操作系统/编译器的细节。可以假设为 x86。
似乎另一种方法是使用 TR1(我没有 C++11)并以某种方式使用 /dev/random 播种?
现在我有这个,但它仍然使用 time(NULL) 作为种子,在 1 秒内无法正常运行:
#include <iostream>
#include <tr1/random>
int main()
{
std::tr1::mt19937 eng;
eng.seed(time(NULL));
std::tr1::uniform_int<int> unif(1, RAND_MAX);
int u = unif(eng);
std::cout << (float)u/RAND_MAX << std::endl;
}
【问题讨论】:
-
您愿意使用操作系统/编译器特定的功能吗?
-
我想避免这种情况......我将在各种系统上部署它
-
多种多样?它们仍然都是 x86 吗?
-
好的,然后在此处查看我的答案:stackoverflow.com/questions/7617587/… 如果您愿意,我也可以将其作为答案发布在这里。
-
作为一个特定于平台的技巧,它对代码可移植性的影响很小,如果您愿意假设目标系统具有堆栈地址随机化(现在在桌面操作系统上很常见),您只需将
uint_ptr_t的局部变量地址并将其用作种子。哦,如果你对它不是 100% 有信心,你可以用你找到的任何其他方法对它进行异或运算,种子会和最好的一样好。
标签: c++ random random-seed