答案:1.可能用到的函数:randomize(),srand(),rand(),random().
◎void randomize(void)
通过time函数来得到一个随机数,此数将成为起始发生数据
(stdlib.h | time.h)
◎void srand(unsigned number)
该函数和rand函数配合使用,产生随机数的起始发生数据
◎int rand(void)
产生一个随机数(0到 0x7fff 之间)
(stdlib.h)
◎int random(int num)
得到一个在0和参数num之间的随机数
(stdlib.h)
2.随机数生成的原理
“计算机产生的随机数一般都只是一个周期很长的数列,不是真的随机数。也就是说,随机数一般是伪随机数,每个随机数都是由随机种子开始的一个已定的数列(周期很长)。一般地,为了随机数更真一点,随机种子在系统中通常是参照系统时钟生成的。”
以上引用了别人的话。有几个关键点:一是所谓的随机数是伪随机数,二『伪随机数生成器返回的每一个值完全由它返回的前一个值所决定数(最终,该种子决定了一切)』。所以产生随机数,首先要解决随机数种子的问题。下面举几个可能遇到的问题:
一、两次运行产生的随机数列相同
……
for(i=0;i<10;i++) printf("%d",rand());
……
上面的程序本意是每次运行后,屏幕输出10个随机数。但如果紧紧只是这段代码,那后果就是,无论运行多少次,每次产生的这10个随机数都和前一次生成的10个数一一对应。
可做如下修改:
……
randomize();
for(i=0;i<10;i++) printf("%d",rand());
……
如此,每次运行产生的随机数列就是不同的啦。因为randomize()是以系统时间为随机数种子的。如果两次运行时间间隔大于一秒,那么种子就会不同。
下面这个例子的结果我想大家应该猜得到
……
for(i=0;i<10;i++)
{
printf("%d",rand());
randomize();
}
……
这将产生10个完全相同的数,下次运行又会产生另外10个相同的数。
二、关于randomize()和srand()的区别。
根据我的试验,到以下结论: randomize()等同srand(time(NULL))。
以前,照抄网上的代码将srand(time(NULL));放 到了循环当中每个rand()函数的前面,结果和上面那个例子一样生成一列同样的数。现在想想是因为对随机数产生的原理还不清楚。randomize() 和srand()都是用来设置随机数种子的。而randomize()可以看成是函数srand()的一个特例,即用当前时间为参数的srand()
(当然函数可能没有关系,但效果上可以这么说)。那么现在只要考虑srand()就可以了。
当srand(number);后,会生成一个与随机数种子seed,即[seed =Srand(number)](注意:srand()没有返回值,此式仅为数学上的表达式)。seed被确定后,rand()函数调用seed的值来进 行计算。计算将得到一个数列,如果你循环10次使用rand()函数的话,你得到的其实是这个数列中的前10个数而已。假如想要新的随机数列,必须更改种 子。而本机时间就是一个很好的用于生成种子的“引子”,因为本机时间是个以秒为最小单位的量,有10位有效数字组成。也就是说,你可以得到10的10次方 个随机数种子,这可以满足一般使用的需要了。
以下程序可以测试:number决定srand(number)所设置的seed的值
#include <stdlib.h>
#include <time.h>
main()
{
int i;
clrscr();
/*运行后将得到一个上下颠倒的数列。验证了number->seed->random_number[]的唯一确定性。*/
for(i=0;i<6;i++)
{
srand(i);
printf("%d\n",rand()) ;
}
printf("========\n");
for(i=0;i<6;i++)
{
srand(5-i);
printf("%d\n",rand());
}
/*-------------*/
/*验证seed被确定后,rand()产生的随机数只是一个确定序列中的一个数*/
/*无论运行多少次,生成的结果都一样*/
srand(1234);
for(i=0;i<5;i++)
printf("%8d\t",rand());
getch();
}
上一个:C语言八皇后问题中怎样判断满足行列斜线没有棋子的条件?
下一个:关于编程技术和C语言及C++微机原理等和基础知识告…