数值概率算法


随机数

  • 伪随机数
  • 线性同余法:选择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算法


蒙特卡洛算法