编程能力提高-----rand和srand的用法

来源:互联网 发布:js数组去重复的方法 编辑:程序博客网 时间:2024/06/13 21:59

概述

首先总体来看:srand初始化随机种子,rand产生随机数,这两个函数都在stdlib.h头文件当中。


rand(伪随机数发生器)

1.表头文件: #include “stdlib.h”
2.函数原型 : int rand(void)
  连续调用 rand 将返回 0 到 int 类型的最大可表示的正值(含该值)之间的整数值,它们是一个伪随机数生成器所产生的连续结果。在标准 C 中,rand 的上界是上 RAND_MAX 所指定的,这个值至少是 32 767。
3.函数使用说明 :
   在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。(即srand(1);)。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它。初始化的函数就是srand()。

4.返回值:
  因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回[0,RAND_MAX]之间的随机整数值,RAND_MAX的范围最少是在32767(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。不过一般在使用时,rand() % N 就是[0,N1]之间的均匀分布,再加上偏移rand() % N + A就是[A,N1+A]之间的均匀分布。
权威一点的解释,请查看:http://en.cppreference.com/w/cpp/numeric/random/rand


srand(是随机数发生器的初始化函数)

表头文件: #include “stdlib.h”
函数原型void srand (unsigned int seed);
  参数seed必须是个整数,通常可以利用geypid()或time(0)的返回值来当做seed。
函数用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子,后面的rand() 函数会出现一样的随机数。为了在多次调用rand产生不同随机数,必须先利用srand()设好随机数种子。如果未设随机数种子,rand()在调用时会自动设随机数种子为1。(即srand(1);)不过为了防止种子重复,常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将 time_t 型数据转化为(unsigned int)型再传给srand函数。

  1. srand((unsigned) time(&t)); //较复杂,参考下面的time函数用法可以理解,但很少用。看用法2如何改进
  2. srand((unsigned)time(NULL)); //不需要定义time_t型t变量,传一个NULL作为参数
  3. srand( time(0) ); //是方法2的简写形式。
  4. srand((int)getpid()); 这个用法需要注意的是,使用程序的ID(getpid())来作为初始化种子,在同一个程序中这个种子是固定的。

time函数的用法

所属文件: #include “time.h”
函数原型: time_t time(time_t *timer)
函数功能: 得到机器的日历时间或者设置日历时间
函数返回: 机器日历时间
参数说明: timer=NULL (注意NULL的值为0)时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long类型

基本系统数据类型time_t
在unix/linux系统中,时间的表示方法是以1970年1月1日00:00:00所经过的秒数,使用基本系统数据类型time_t表示。C语言中时间本身就是用数值保存的, 但用的不是UINT (unsinged int)而已,它用的是time_t, 你可以在开发环境里找到它的定义,会发现它是typedef long time_t (是经过复杂的定义,没有这么直观),也就是说它是长整型的数据类型。 而在VC++6.0中, long和int的长度一样,所以unsigned int是可以保存时间的, 但是一般就直接用time_t。

例如:time_t time = time(0); //这行代码应该没有问题了


范例

/* 产生介于[0,100)间的随机数值*/#include <stdlib.h>#include <iostream>#include <time.h>       /*用到了time函数,所以要有time.h头文件*/#define  MAX 10using namespace std;void main(){    int number[MAX]={0};    int i;     /*播种子,注意这个用法,可以简写为srand (time);还要注意要在循环外面srand*/      srand((unsigned) time(NULL)); /* use current time as seed for random generator*/     for(i=0;i<MAX;i++)    {        number[i]=rand()%100;    /*产生100以内的随机整数,注意是求余运算。这里可以改进,见下文*/                           /*产生[1,100] 间的随机数值  j=1+(int)(100.0*rand()/(RAND_MAX+1.0));  */         printf("%d ",number[i]);    }    printf("\n");    system("pause");}

执行两次,结果并不相同:

2 22 74 93 62 91 53 94 78 46
请按任意键继续…
91 38 20 9 16 65 67 52 11 6
请按任意键继续…

注意事项:

  1. 用”int x = rand() % 100;”来生成[ 0, 100) 之间的随机数是不可取的,比较好的做法是: int x=(int)(N*rand()/(RAND_MAX+1.0));产生一个[0,N)之间的随机数。
  2. 补充一点就是srand这个函数一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的数字。

总结

  我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你改变这个种子的值。C提供了srand()函数初始化随机产生器,既rand()函数的初始值。srand()函数的使用这里介绍了三种方法。

0 0
原创粉丝点击