【发布时间】:2012-08-10 05:26:25
【问题描述】:
我有两个问题。
还有哪些其他方法可以在不使用
srand(time(NULL))的情况下在 C++ 中播种伪随机数生成器?我问第一个问题的原因。我目前使用时间作为生成器的种子,但生成器返回的数字始终相同。我很确定原因是因为存储时间的变量在某种程度上被截断了。 (我有一条警告消息说,“隐式转换失去整数精度:'time_t'(又名'long')到'unsigned int')我猜这告诉我,从本质上讲,我的种子直到明年才会改变发生。就我的目的而言,使用时间作为我的种子就可以了,但我不知道如何摆脱这个警告。
我以前从未收到过该错误消息,所以我认为它与我的 Mac 有关。它是 64 位 OS X v10.8。我也是用Xcode写和编译的,但是在其他电脑上用Xcode没问题。
编辑:
在玩弄和研究了更多之后,我发现了 64 位 Mac 存在的一个错误。 (如果我弄错了,请纠正我。)如果您尝试让您的 mac 使用 time(NULL) 作为种子选择 1 到 7 之间的随机数,您将始终得到数字 4。总是。我最终使用mach_absolute_time() 为我的随机发生器播种。显然,这消除了我程序的所有可移植性......但我只是一个业余爱好者。
编辑2: 源代码:
#include <iostream>
#include <time.h>
using namespace std;
int main(int argc, const char * argv[]) {
srand(time(NULL));
cout << rand() % 7 + 1;
return 0;
}
我再次运行此代码进行测试。现在它只返回 3。这一定与我的计算机有关,而不是 C++ 本身。
【问题讨论】:
-
就像园艺一样,你只需要种一次种子。
-
我曾经有类似的行为,我发现初始数字是相同的,但是如果我连续打印一堆随机数,它们就会不同。通常第一个在每次运行中都是相同的,但是到第二次或第三次通过打印循环时它就不同了。尝试连续打印几个并验证运行时它们总是相同的......
-
你使用对应的 srand() 生成器吗?兰德()?
-
@Redmastif:你错了。 rand() 非常适合我。