请教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所说,每次都重新设置种子的话,由于时间间隔太近,【电脑循环计算速度太快了导致】得到相同的种子,也就对应相同的随机数队列
------解决方案--------------------
计算机里面是没有真正的随机数的,这些库产生都是伪随机数列,同一个种子值进去,产生是一串相同的数列,数列中数的分布情况是衡量这个随机数函数好坏的主要标准
------解决方案--------------------
虽然没研究过,平时只是用,但是看完楼上的这些回复,对这个函数有一定了解了
------解决方案--------------------
马克,学习一下,积分快不够提问题列。。。。
------解决方案--------------------
引用: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.
*