数值概率算法
随机数
- 伪随机数
- 线性同余法:选择4个数,模数m, 倍数 a, 增量 c, 种子 x0, 满足 2<=a<m,0<=c<m,0<=x0<m
生成伪随机数序列: 0<=xn<m: xn+1=(axn+c)mod m; x0=d,d是该随机序列的种子 - gcd(m , a )=1, 且a是素数
//产生0 ~ 2^{32} 之间的随机数
#include<stdlib.h>
#include<stdio.h>
#include<time.h> //当前时钟为种子
main()
{
int i;
srand((ussigned)time(NULL)); //srand设置种子数, 0~65535
for(i=0;i<10;i++)
printf("%d",rand()); //打印10个随机数
printf("\n");
}
//生成0~1的随机数
#include<stdio.h>
#include<time.h> //当前时钟为种子
main()
{
int i;
srand((ussigned)time(NULL)); //srand设置种子数, 0~65535
for(i=0;i<10;i++)
printf("%.1f",rand()/(pow(2,16)*1.0)); //打印10个随机数
printf("\n");
}
// 生成0-99 的随机数
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main( )
{int i;
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10;i++ )
printf( "%d\n", rand()%100);
}
//20个0-99 不重复的随机数
定义一个组数,存入0~99,随机取一个,做个标记,这样取20个就不会有重复。
程序代码:
#include <stdio.h>
#include <time.h>
int main(void)
{
int i,n,a[100];
srand(time(0));
for(i=0;i<100;i++)
a[i]=i;
i=0;
while(1)
{
n=rand()%100;
if(a[n]!=-1)
{
printf("%d ",n);
a[n]=-1;
if((++i)==20)break;
}
}
printf("\n\n");
return 0;
}
- 总结:
1.产生一个随机数(从0到32767)
srand((unsigned) time(NULL)); //为了提高不重复的概率
rand(); //产生随机数
2.产生从m到n的随机数(包括m,不包括n)
srand((unsigned) time(NULL)); //为了提高不重复的概率
rand()%(n - m + 1) + m; //使用时将m和n换为具体数即可
随机投点法计算pi值
- 设直径为r的圆和外切正方形。向正方形随机投n个点,设落在圆内的点的数为k,由于投入点在正方形内均匀分布,则落入圆内的点的概率是:
(PI∗pow(r,2))4∗pow(r,2)=PI4
n足够大的时候, k与n之比就逼近这个概率, 所以PI 约等于 (4* k)/n
这里写代码片
计算定积分
舍伍德算法
- 舍伍德算法消除算法所需计算时间与输入实例间的关联
- 设:A是一个确定性的算法,输入实例为x时,所需的计算时间是tA(x) 。 Xn 是算法A的输入规模为n的全体,输入规模是n时的算法A所需的平均时间是:
t¯A(n)=∑x∈XntA(x)/|Xn| - 希望获取随机化的算法 B,使得每一个x∈Xn均有tB(x)=t¯A(n)+s(n),
算法B关于n规模的随机实例的平均时间是:
t¯B(n)=∑x∈XntB(x)/|Xn| - 易得:t¯B(x)=t¯A(n)+s(n),
当s(n)和t¯A(n)比较可以忽略,舍伍德可以得到比较好的算法
线性时间选择算法
随机洗牌算法
拉斯维加斯算法
大质数分解:pollard rtho算法
蒙特卡洛算法