当前位置:编程学习 > C/C++ >>

c语言中,有多少中生成随机数的方法,哪种最好?

答案:
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++微机原理等和基础知识告…

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,