1、rand()函数和srand()函数被声明在头文件stdlib.h中,time()函数在文件time.h
2、相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。
3、没有先调用srand(),rand()就和事先调用srand(1)所产生的结果一样
4、随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。
5、只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)
6、C语言生成随机数需要用到两个函数,一个是srand(),一个是rand(),首先给srand()提供一个种子,unsigned int类型,其取值范围从0~65535,srand()根据这个种子会由一个特定的公式生成一个随机数序列;然后调用rand(),它会依次从这个序列中返回一个数(在0到32767之间),而在不指定srand()种子的情况下,它每次都使用默认的种子(5与6存在矛盾,6是对的,5应该是其他语言的)
//1、要取得0~1之间的浮点数
randnumber =rand() / (double)(RAND_MAX);
//2、更大范围的随机浮点数,比如0~100
randnumber =rand() /((double)(RAND_MAX)/100);
//3、取[0,10)之间的随机整数
randnumber = rand() % 10;
//4、[a,b)之间的随机整数
randnumber =(rand() % (b - a)) + a;
//举出栗子一: #include<dos.h> static unsigned int RAND_SEED; unsigned int random(void) { RAND_SEED=(RAND_SEED*123+59)%65536; /*是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的*/ return(RAND_SEED); } void random_start(void) { int temp[2]; movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); /*这个函数用来移动内存数据;把位于0040:006CH存储单元中的双字 放到数组temp的声明的两个存储单元中; FP_SEG(far pointer to segment)是取temp数组段地址的函数; FP_OFF(far pointer to offset)是取temp数组相对地址的函数; 0040:006CH处存放的是,时钟记数器*/ RAND_SEED=temp[0]; //通过temp数组把0040:006CH处的一个16位的数送给RAND_SEED } main() { unsigned int i,n; random_start(); for(i=0;i<10;i++) printf("%u\t",random()); printf("\n"); }
//举个栗子二 #include <iostream> #include <ctime> using namespace std; int main() { srand((unsigned)time(NULL)); unsigned int r = rand(); cout << r << endl; return 0; }
//举个栗子三: #include <stdlib.h> #include <iostream.h> #include <conio.h> #include <time.h> void main() { srand( (unsigned)time( NULL ) ); /*放在循环外,由于计算机运行很快,所以你每次用time得到的时间都是一样的(time的时间精度较低,只有55ms)*/ for(int i=0;i<100000;i++) { cout<<rand()<<endl; } }