加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – srand(time(NULL))生成类似的结果

发布时间:2020-12-16 06:45:43 所属栏目:百科 来源:网络整理
导读:参见英文答案 rand() function in C is not random even when seeded????????????????????????????????????2个 我不明白为什么srand()在运行之间生成如此相似的随机数! 我试图运行以下代码 srand ( time(NULL) );int x = rand();cout x endl; 然而,不是一个
参见英文答案 > rand() function in C is not random even when seeded????????????????????????????????????2个
我不明白为什么srand()在运行之间生成如此相似的随机数!

我试图运行以下代码

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

然而,不是一个适当的随机数,我总是得到几乎相同的数字,随着时间的推移,这个数字正在缓慢增长.所以我得到的数字如:11669,11685,11701,11714,11731.

我究竟做错了什么?

我正在使用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

在Windows下使用VC – 你会注意到它的非常低的方差
先调用rand() – 和

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读