我有两个问题。
在C++中,除了使用
srand(time(NULL))
,还有哪些方法可以用来生成伪随机数?我之所以问第一个问题是因为我目前正在使用时间作为我的生成器种子,但生成器返回的数字总是相同的。我很确定原因是因为存储时间的变量被截断了一定程度。(我收到了一个警告消息,“隐式转换失去整数精度:‘time_t’(又名‘long’)到‘unsigned int’”)。我猜测这告诉我本质上我的种子直到下一年才会改变。对于我的目的,使用时间作为我的种子完全可以工作,但我不知道如何摆脱这个警告。
我以前从未收到过这个错误消息,所以我认为它与我的Mac有关。它是64位OS X v10.8。我也使用Xcode编写和编译,但在其他电脑上使用Xcode时没有遇到任何问题。
编辑:
经过更多的尝试和研究,我发现64位的Mac存在一个bug。(如果我有误请纠正我。)如果你尝试让你的Mac使用time(NULL)
作为种子选取1到7之间的随机数,你将总是得到数字四。一直都是。我最终使用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++本身有关。