且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

srand(time(NULL)) 产生类似的结果

更新时间:2023-02-03 12:07:08

一、srand() 不是随机函数;它设置了起点伪随机序列.有点令人惊讶的是,你的rand() 的实现似乎是返回一个基于之前的状态,而不是新计算的状态,所以第一个调用 srand() 后的值在很大程度上取决于传递给的值srand().如果你要写:

First, srand() isn't a random function; it sets up the starting point of a pseudo-random sequence. And somewhat surprisingly, your implementation of rand() seems to be returning a value based on the previous state, and not on the newly calculated state, so that the first value after a call to srand() depends very much on the value passed to srand(). If you were to write:

srand( time( NULL ) );
rand();
std::cout << rand() << std::endl;

,我相信你会看到更多的不同.

, I'm sure you'll see a lot more difference.

FWIW:我在 Windows 和 Linux 上都尝试了以下方法:

FWIW: I tried the following on both Windows and Linux:

int
main()
{
    srand( time( NULL ) );
    int r1 = rand();
    std::cout << r1 << ' ' << rand() << std::endl;
    return 0;
}

以一秒为间隔调用 10 次,我得到:

Invoked 10 times at a one second interval, I got:

16391 14979
16394 25727
16397 3708
16404 25205
16407 3185
16410 13933
16417 2662
16420 13411
16427 2139

在 Windows 下使用 VC++—您会注意到第一次调用 rand()—and

with VC++ under Windows—you'll note the very low variance of the first call to rand()—and

1256800221 286343522
955907524 101665620
1731118607 991002476
1428701871 807009391
44395298 1688573463
817243457 1506183315
507034261 1310184381
1278902902 54648487
2049484769 942368151
1749966544 1833343137

在Windows下使用g++;在这种情况下,即使读取的第一个值也是相对随机.

with g++ under Windows; in this case, even the first value read is relatively random.

如果你需要一个好的随机生成器,你可能不得不使用一个来自 Boost;该标准并没有说明什么算法应该是使用,并且实现的质量差异很大.

If you need a good random generator, you'll probably have to use one from Boost; the standard doesn't say much about what algorithm should be used, and implementations have varied enormously in quality.