真/伪随机、以及随机算法
伪随机性(英语:Pseudorandomness)是一个过程似乎是随机的,但实际上并不是。伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机。什么是随机数随机数在计算机应用中使用的比较广泛,最为熟知的便是在密码学中的应用。随机数有3个特性,具体如下:
随机性:不存在统计学偏差,是完全杂乱的数列不可预测性:不能从过去的数列推测出下一个出现的数不可重现性:除非将数列本身保存下来,否则不能重现相同的数列
Random算法Random的使用是把要随机的集合顺序排列,从集合中随机挑选Random详细用法请看我这篇文章Java中Random的用法Shuffle算法Shuffle算法和排序算法正好相反,是从有序到乱序的一个过程,俗称洗牌算法。在Java中,有现成的shuffle算法实现,即Collections类中的两个重载的shuffle方法:
publicstaticvoidshuffle(Listlist){Randomrnd=r;if(rnd==null)r=rnd=newRandom();shuffle(list,rnd);}privatestaticRandomr;publicstaticvoidshuffle(Listlist,Randomrnd){intsize=list.size();if(size1;i--)swap(list,i-1,rnd.nextInt(i));}else{Objectarr[]=list.toArray();//Shufflearrayfor(inti=size;i>1;i--)swap(arr,i-1,rnd.nextInt(i));//DumparraybackintolistListIteratorit=list.listIterator();for(inti=0;iC语言的伪随机数
一直想好好的系统的学习一下C语言的伪随机数,今天终于逮到机会了
伪随机数C语言中有可以产生随机数据的函数,需要添加stdlib.h和time.h头文件。首先在main函数开头加上srand(unsigned)time(NULL))。先来介绍一下srand头文件:定义函数:voidsrand(unsignedintseed);函数说明:srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用getpid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
再来介绍一下time,函数名称:time函数原型:time_ttime(time_t*timer)函数功能:得到机器的日历时间或者设置日历时间函数返回:机器日历时间参数说明:timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long类型所属文件:
因此上述的srand((unsigned)time(NULL))是利用系统时间来初始化随机种子的。
最后来介绍一下重要的一个函数rand
rand函数头文件:定义函数:intrand(void)函数功能:产生随机数函数说明:因为rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以,在一定的范围里可看成是随机的。rand()会返回一随机数值,范围在0至RAND_MAX间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。返回值:返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsignedint双字节是65535,四字节是4294967295的整数范围。且0-RAND_MAX每个数字被选中的机率是相同的。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。
举个例子
#include#include#includeintmain(){srand((unsigned)time(NULL));for(inti=0;i