在函数速查上看到的rand()君:
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 int main(void) 5 { 6 int i; 7 8 printf("Ten random numbers from 0 to 99\n\n"); 9 for(i=0; i<10; i++) 10 printf("%d\n", rand() % 100); 11 return 0; 12 }
可产生十个随机数。
开始不理解的地方:rand()%100什么意思?→%100可以保证输出的随机数大小在100之内,算是二次处理。
但是随机数产生的原理呢?因为计算机不像是可以真的随机产生些什么的工具。
果然rand()也只是个伪随机数发生器。我找到的原理解释如下:
→产生整数rand的原理是:
y=ax+b(mod n)其中,n一般是一个很大的素数,几万。
a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x,
他被称为seed。
每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,
虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。
为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t
在CPP上有一段代码,大概就是上述原理咯:
1 #include<stdio.h> 2 int rand0(void); 3 int main() 4 { 5 int i; 6 for(i=0;i<5;i++) 7 printf("%hd\n",rand0()); 8 return 0; 9 } 10 11 /*rand0()函数*/ 12 static unsigned long int next=1;//next是种子 13 int rand0(void) 14 { 15 next=next*1103515245+12345; 16 return (unsigned int)(next/65536)%32768; 17 }
输出:
跟书上一摸一样啊……而且无论运行几次都是一模一样的一组数据。这是因为每次运行都是从同一个种子值next=1开始的,要得到不同组的随机数,还要用一个srand1()函数来重置种子值。
时间: 2024-11-14 16:14:22