神秘的随机数 - 即使在"srand()之后也想要相同"

nop*_*ole 4 c++ random

可能重复:
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()只是一个非常好的伪随机数生成器. (2认同)

Dia*_*cus 8

rand()在VS2008函数返回的:return ((current_value = current_value * 214013 + 2531011) >> 16) & 0x7fff;.你用srand设置的current_value.这个函数是这样的,它将为类似的种子返回类似的伪随机数,并且没有任何帮助.问题是在第一次调用中最随机的那些位被>> 16部分吃掉了.要解决问题,只需滚动几次(rand(); rand();).