码迷,mamicode.com
首页 > 其他好文 > 详细

很好奇的随机函数rand()君

时间:2015-04-02 18:35:58      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

在函数速查上看到的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()函数来重置种子值。

很好奇的随机函数rand()君

标签:

原文地址:http://www.cnblogs.com/suzyc/p/4387305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!