可能重复:
Rand生成相同的数字
在回答StackOverflow上的另一个问题时尝试以下方法:
#include <time.h>
#include <iostream>
using namespace std;
main() {
srand ( time(NULL) );
cout << (float) rand() / RAND_MAX << endl;
cout << ((float) rand()) << endl;
cout << RAND_MAX << endl;
cout << (float) rand() / RAND_MAX << endl;
}
Run Code Online (Sandbox Code Playgroud)
非常奇怪的是,第一个输出数字总是一个相似的数字,无论是在带有cygwin的Windows 7上还是带有Leopard的Mac上.
最后一个数字是从0到1的良好随机数.如果第一cout行被注释掉,则第一个打印的随机数总是类似的值1.
怎么会发生这种情况?
fre*_*low 11
我过去偶然发现了这种现象.第一次调用rand()四次连续运行的测试程序给出了以下输出:
27592
27595
27598
27602
Run Code Online (Sandbox Code Playgroud)
请注意这些数字有多相似?这是因为随机数发生器用当前时间初始化,第一个结果受到严重影响.类似的初始值srand产生类似的初始结果rand.就这么简单.
如果你计算rand() % n,这种相似性是无关紧要的,但如果你采用这种rand() / m方法,这就是一个问题.例如,如果除以rand()100,您将连续3次获得相同的数字!现在让我们看看四个连续运行的第二个结果rand():
11520
22268
248
10997
Run Code Online (Sandbox Code Playgroud)
这看起来好多了,不是吗?一个简单的快速修复是rand()在播种后调用几次并简单地忽略结果.
int main()
{
srand(time(0));
rand(); rand(); rand();
std::cout << rand() / float(RAND_MAX) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
rand()在VS2008函数返回的:return ((current_value = current_value * 214013 + 2531011) >> 16) & 0x7fff;.你用srand设置的current_value.这个函数是这样的,它将为类似的种子返回类似的伪随机数,并且没有任何帮助.问题是在第一次调用中最随机的那些位被>> 16部分吃掉了.要解决问题,只需滚动几次(rand(); rand();).