srand(time(NULL))生成类似的结果 [英] srand(time(NULL)) generating similar results

查看:237
本文介绍了srand(time(NULL))生成类似的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不明白为什么srand()在两次运行之间产生类似的随机数字



我试图运行下面的代码

  srand(time(NULL)); 
int x = rand();
cout<< x<< endl

然而,不是一个合适的随机数,我总是得到几乎相同的数字,随着时间的推移。所以我得到的数字:11669,11685,11701,11714,11731。



我做错了什么?
$ b

我正在使用Visual Studio 2010 SP1。



好的,srand()真的那么简单吗?我是说如何将任何人称为随机函数?

  srand(1)=> rand()= 41 
srand(2)=> rand()= 45
srand(3)=> rand()= 48
srand(4)=> rand()= 51
....


解决方案

首先, srand() 不是随机函数;它建立伪随机序列的起始点
。有些令人惊讶的是,您的
实施 rand ) 似乎是基于
之前的状态返回一个值,而不是在新计算的状态,所以第一个
值在调用 srand()在很大程度上取决于传递给
srand()的值。如果你写:

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

,我相信你会看到更多的差异。



FWIW:我在Windows和Linux上尝试了以下操作:

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

每隔一秒调用10次,

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

VC ++在Windows&mdash下;你会注意到
第一次调用 rand()—和


$ b的方差非常低$ b

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

g ++在Windows下;在这种情况下,即使第一个值是
相对随机。



如果你需要一个好的随机生成器,你可能需要使用一个
from Boost;标准并没有说明什么算法应该使用
,实现的质量差别很大。


I don't understand why srand() generates so similar random numbers between runs!

I am trying to run the following code

srand ( time(NULL) );
int x = rand();
cout << x << endl;

However instead of a proper random number I always end up with almost the same number, which is growing slowly as the time goes. So I get numbers like: 11669, 11685, 11701, 11714, 11731.

What am I doing wrong?

I am using Visual Studio 2010 SP1.

OK, is srand() really that simple? I mean how would anyone call it a random function?

srand(1) => rand() = 41
srand(2) => rand() = 45
srand(3) => rand() = 48
srand(4) => rand() = 51
....

解决方案

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: 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;
}

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

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

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

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.

这篇关于srand(time(NULL))生成类似的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆