c语言rand函数赌大赌小,请问rand()函数遇到的小疑点

请教rand()函数遇到的小问题

#include 

#include 

#include  /*用到了time函数,所以要有这个头文件*/

#define MAX 10

int main( void)

{

int number[MAX] = {0};

int i;

for(i = 0; i 

{

srand((unsigned) time(NULL)); /*播种子*/

number[i] = rand() % 100; /*产生100以内的随机整数*/

printf("%d ", number[i]);

}

printf("\n");

return 0;

}

这个函数打印出来的随机值都是同一个值,不知道为什么。于是我就调试,发现调试的时候,rand()函数返回值并不是同一个数。有人对我说time()的返回值的单位是秒,如果我的程序在1s内结束,那么设置的就是同一个种子。可是我把srand((unsigned) time(NULL)); 这一句搬到循环外面就对了,可这时候所有rand()函数的种子不都是一样的吗。为什么随机值却不一眼了呢。

然后又我写了个程序

#include

#include

#include

/************************************************/

/*随机获取[M , N]区间内的浮点数 */

double RandomFloate(int M, int N)

{

int RandomValue1;

double RandomValue2;

time_t t;

srand((unsigned)time(&t));

RandomValue1 = M + rand() % (M - N + 1);

RandomValue2 = rand() / (RAND_MAX + 1);

return RandomValue1 + RandomValue2;

}

/************************************************/

int main()

{

int i;

for(i= 0;i<100; i++)

{

printf("%f\t",RandomFloate(2,5));

}

}

这回没有循环,可是随机值还是一样的,我就搞不懂了,谁能解释一下吗?

------解决方案--------------------

随机数种子在一开始设定一次就可以

不是每次取随机数前都设一次种子

------解决方案--------------------

随机数种子只设置一次  剩下的就系统自己处理

第二个程序 和第一个比起来 没什么实质的改变   同样的是每个随机数之前都设置了一次种子

你在第一个程序中 每次生成随机数后看看 sleep(1000)看看 结果会不会相同

------解决方案--------------------

引用:Quote: 引用:随机数种子在一开始设定一次就可以

不是每次取随机数前都设一次种子

只设置一次的话,下次的种子岂不是和上一次一样的,那么随机值岂不是一样了

随机数种子并不是确定一个随机数,而是确定一个随机数队列

所以你设好一个种子,就有了一整列的随机数等着你来取,你一个一个往下取就是了

反而你每次都重新设置种子的话,由于时间间隔太近,得到相同的种子,也就对应相同的随机数队列,这样你每次取随机数都取的是这个队列的第一个数,结果当然就是相同的了

------解决方案--------------------

你要看time返回的是不是同一个值

------解决方案--------------------

引用:Quote: 引用:随机数种子在一开始设定一次就可以

不是每次取随机数前都设一次种子

只设置一次的话,下次的种子岂不是和上一次一样的,那么随机值岂不是一样了

rand内部会更新随机种子的

正如czarten所说,每次都重新设置种子的话,由于时间间隔太近,【电脑循环计算速度太快了导致】得到相同的种子,也就对应相同的随机数队列

------解决方案--------------------

计算机里面是没有真正的随机数的,这些库产生都是伪随机数列,同一个种子值进去,产生是一串相同的数列,数列中数的分布情况是衡量这个随机数函数好坏的主要标准

------解决方案--------------------

虽然没研究过,平时只是用,但是看完楼上的这些回复,对这个函数有一定了解了

------解决方案--------------------

马克,学习一下,积分快不够提问题列。。。。

162615128.gif

------解决方案--------------------

引用:Quote: 引用:随机数种子只设置一次  剩下的就系统自己处理

第二个程序 和第一个比起来 没什么实质的改变   同样的是每个随机数之前都设置了一次种子

你在第一个程序中 每次生成随机数后看看 sleep(1000)看看 结果会不会相同

第二个只是设置了一次啊,还能怎么改啊,难道到了把srand()放在mian()函数里面吗

for循环里每次调用 RandomFloate  都会设置一次的  解释上面的说得已经很清楚了   我觉得够了

------解决方案--------------------

C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C

/***

*rand.c - random number generator

*

*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.

*

*Purpose:

*       defines rand(), srand() - random number generator

*

*******************************************************************************/

#include 

#include 

#include 

#include 

#ifndef _MT

static long holdrand = 1L;

#endif  /* _MT */

/***

*void srand(seed) - seed the random number generator

*

*Purpose:

*       Seeds the random number generator with the int given.  Adapted from the

*       BASIC random number generator.

*

*Entry:

*       unsigned seed - seed to seed rand # generator with

*

*Exit:

*       None.

*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值