随机数生成及应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

double hrand(){ static unsigned long x=1;
double x,y,n=0,m=10000;
for(i=1;i<=10000;i++){ x=hrand();
x=(314159269L*x+453806245 L)%(2147483648L);
y=x*x;
n=n+y; } printf("%.16lf\n",(double)n/m); return(0);
double hrand() { static unsigned long x=1; x=(314159269L*x+4538062 45L)%(2147483648L); return((double)x/214748364 8.0); }
rn xn / 2147483648
rn ~ U 0,1
x21=1; x22=7; x23=5; x24=2; x25=3; x26=10; x27=4; x28=6; x29=9; x30=8;
数学语言转化为C语言: 利用混合同余法产生[0,1)内的随机数
x1 1 xn 1 314159269 x n 453806245(mod 2147483648)
return((double)x/2147483648.0);
} int main(){ long i,count=0;
double x,y,y1;
for(i=1;i<=1000000;i++){ x=hrand(); y=hrand(); /*x从0到1*/ /*y从0到1*/
y1=x*x;
/*x^2在x处的值*/
wenku.baidu.com

注意:
如果你在第一次调用rand()之前没有调用srand(),那 么系统会为你自动调用srand()。而使用同种子相同 的数调用 rand()会导致相同的随机数序列被生成。
真假随机数对比
#include<stdlib.h> #include<stdio.h> #include<time.h>/*用到了time函数,所以要有这个头文件*/ #define MAX 10 int main(void) { int number[MAX] = {0}; int i; srand(time(0));/*播种子,time(0)是系统当前时间*/ for(i = 0; i < MAX; i++) { number[i] = rand() % 100;/*产生100以内的随机整数*/ printf("%d\n",number[i]); } return 0; }
提示:rn~U[3,5)?
rn=2*rn+3
利用库函数产生随机数:
# include <stdlib.h> srand() rand() standard library标准库头文件 随机数发生器的初始化函数 rand函数不是真正的随机数生成器, 而srand()会设置供rand()使用的随机 数种子
调用函数,产生随机的点
这是我们要积分的函数, 也是阴影区域的限制条件
当随机点落在阴影区域 时,计数变量加一
运行结果为
方法二:平均值法
简单的说就是利用随机数来求Y的平均值,再乘 以区间长度
#include "stdio.h"
#include "stdlib.h" double hrand(); int main(){ long i;
在main函数中如此调用
int main{
x=hrand();
return((double)x/214748364 8.0); }
y=hrand();
return 0;
}
可以在特定的坐标范围内中产生随机点的坐标
int main(){ long i,count=0; double x,y,y1; for(i=1;i<=1000000;i++){ x=hrand(); y=hrand(); y1=x*x; if(y<y1){ count++} } printf("%.16lf\n",(double)count/1000000.0 *1); return(0); /*x从0到1*/ /*y从0到1*/ /*x^2在x处的值*/
那么:我们如何获得那些豆子,以 及怎么才能均匀地撒那些豆子
通过上面的阐述,我们知道可以用 到随机数来产生豆子,以及均匀的 撒这些豆子
#include "stdio.h" #include "stdlib.h" #include "math.h" double hrand(){ static unsigned long x=1; x=(314159269L*x+453806245L)%(2147483648L);
if(y<y1) {count++; /*落入阴影区域,就计数*/ } } printf("%.16lf\n",(double)count/1000000.0*1); return(0); }
double hrand() { static unsigned long x=1;
x=(314159269L*x+4538062 45L)%(2147483648L);
“真正”的随机数
由计算机产生的随机数,即使是我们认为的真正的随机 数,相邻两数之间仍有一定的算数或逻辑联系。我们能做到, 只是让递推关系的初始值具有随机性,然而递推关系本身不 变。
回到问题:
怎么计算蓝色部分面积
怎么算定积分

1
0
x dx
2
方法一:随机点法
向方形区域内随机扔N颗豆子,有a颗落入蓝色不 规则图形内
随机数的生成及应用
问题引入: 如何计算定积分

1
0
x dx
2
计算机产生随机数的特点:
用数学方法产生随机数,就是利用计算机能直接进行算术运 算或逻辑运算的特点,产生具有均匀总体、简单子样统计性质的 随机数。
计算机上用数学方法产生随机数,是根据确定的算法推算出 来的,因此严格说来,用数学方法在计算机上产生的“随机数” 不能说是真正的随机数,故一般称之为“伪随机数”。不过对这 些伪随机数,只要通过统计检验符合一些统计要求,如均匀性、 随机性、独立性等,就可以作为真正的随机数来使用。
return((double)x/2147483648.
0); }
运行结果: 0.3319887679961978
线性同余法(LCG法:Linear Congruence Generator)
线性同余法利用数论中的同余运算原理产生随机数。分为 乘同余法、混合同余法等,线性同余法是目前发展迅速且使用 普遍的方法之一。
线性同余法递推式:
xn axn1 c(modM )
其中xn为正整数
乘法同余法:c=0; 混合同余法:c>0.
例: 用乘法同余法产生10以内整数随机数
递推式:
x1 1 xn1 7 x n (mod11)
产生随机数结果:
x1=1; x2=7; x3=5; x4=2; x5=3;
x6=10; x7=4; x8=6;
x9=9; x10=8;
x11=1; x12=7; x13=5; x14=2; x15=3; x16=10; x17=4; x18=6; x19=9; x20=8;
相关文档
最新文档