2种随机数产生写法为什么结果不一样

yitaohust 2010-03-12 04:28:16
之前看到一个问随机数的帖子,顺便我也就弄了一下,发现2种写法,第一个写法随机数生成的总是一样的;第二个写法则生成的不是一样,请分析一下第一种的原因。
第1种:生成的10个随机数总是一样的。

int fun()
{
// srand((unsigned)time(NULL));
srand((UINT)GetCurrentTime());
return rand()%18;
}

int main()
{
int iRand[10];
memset(iRand, 0, sizeof(int)*10);
for(int i=0; i<10; i++)
{
iRand[i] = fun();
printf("%d\n", iRand[i]);
// Sleep(10);

}

return 0;
}


第2种写法:10个随机数一般都不一致。

int main()
{
srand((UINT)GetCurrentTime());
for(int i=0;i<10;i++)
printf("%d\n", rand()%18);

return 0;
}
...全文
191 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rome55 2010-03-12
  • 打赏
  • 举报
回复
算法不一样 结果能一样吗?
wingzero520 2010-03-12
  • 打赏
  • 举报
回复
可以GOOGLE一下rand和srand的源代码,知道了随机数是怎么生成的,你就明白为什么两种写法结果不一样了。
总之不要在循环里调用srand。
如果你非要在循环里srand,可以将fun函数作如下修改……

int fun()
{
LARGE_INTEGER lint;
QueryPerformanceCounter(&lint)
srand(lint.LowPart);
return rand()%18;
}

linxingyu404 2010-03-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100303/17/a835bdf9-b2ae-4a5d-9836-c4b365055f62.html
看看这篇。。
ithiker 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tan870426 的回复:]
就是因为for的执行时间太短了
第一种是每次rand之前设置一次种子
但由于每两次之间间隔时间太短导致每次的种子都一样
所以rand()的结果也都一样

而第二种只是第一次设置了种子
后面的rand()都是用前一次rand()的返回值做种子
结果自然不一样了
[/Quote]

tan870426 2010-03-12
  • 打赏
  • 举报
回复
就是因为for的执行时间太短了
第一种是每次rand之前设置一次种子
但由于每两次之间间隔时间太短导致每次的种子都一样
所以rand()的结果也都一样

而第二种只是第一次设置了种子
后面的rand()都是用前一次rand()的返回值做种子
结果自然不一样了
macrojj 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yitaohust 的回复:]

第1种写法种,我研究过加一个sleep(),然后产生的就不一样了。
所以,我就奇怪了,难道是for判断语句2次判断间隔非常非常小?导致种子一样?但这样理解,那第2种写法咋就生成的不一样呢。
[/Quote]

的确是太小了。
昵称很不好取 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 thefirstz 的回复:]
引用 2 楼 xingzhe2001 的回复:
相同种子的情况下,生成的随机数序列应该是一样的
srand(100);
for(i=0;i<10;i++) cout<<rand();

不一样,每次rand()运行,都会改变种子
[/Quote]
不好意思,理解错了你的意思,是每次程序运行产生的随机数值都一样
昵称很不好取 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xingzhe2001 的回复:]
相同种子的情况下,生成的随机数序列应该是一样的
srand(100);
for(i=0;i<10;i++) cout<<rand();
[/Quote]
不一样,每次rand()运行,都会改变种子
wish_cn 2010-03-12
  • 打赏
  • 举报
回复
对于相同的seed,rand函数产生的随机数序列是一样的。

第一个程序大多数情况下生成的序列是一样的,因为程序执行很快,不容易跨过毫秒边界,导致10次执行GetCurrentTime返回的seed是相同的。其实多执行几次你就会发现,也是会出现不一样的情况的。
昵称很不好取 2010-03-12
  • 打赏
  • 举报
回复
后一次rand()以前一次rand()的返回值为种子
xingzhe2001 2010-03-12
  • 打赏
  • 举报
回复
相同种子的情况下,生成的随机数序列应该是一样的

srand(100);
for(i=0;i<10;i++) cout<<rand();
yitaohust 2010-03-12
  • 打赏
  • 举报
回复
第1种写法种,我研究过加一个sleep(),然后产生的就不一样了。
所以,我就奇怪了,难道是for判断语句2次判断间隔非常非常小?导致种子一样?但这样理解,那第2种写法咋就生成的不一样呢。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧