首页 > 代码库 > 算法1---随机生成算法

算法1---随机生成算法

本文主的主要内容是一些随机算法,主要有四种,下面来详细的介绍:

1 生成随机数
一般c语言中提供了随机数生成函数,
其一是伪随机数--rand:用于返回一个0-32767之间的伪随机数;
其二是随机种子函数--srand:用来初始化随机数发生器的随机种子
#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){    int i,j;    srand((int)time(0));    for (int i = 0; i < 10; i++)    {        for (int j = 0; j < 10; j++)        {            printf("%d  ",rand());        }        printf("\n");    }    return 0;}

 

当然也可以生成一定范围内的随机数
比如生成0——100之间的随机数
#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){    int i,j;    srand((int)time(0));    for (int i = 0; i < 10; i++)    {        for (int j = 0; j < 10; j++)        {            printf("%d  ",rand()*100/32767);        }        printf("\n");    }    return 0;}

 

也可以生成100——200之间的随机数

#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){    int i,j;    srand((int)time(0));    for (int i = 0; i < 10; i++)    {        for (int j = 0; j < 10; j++)        {            printf("%d  ",rand()/1000+100);        }        printf("\n");    }    return 0;}

 

2 生成[0,1]之间均匀分布的随机数算法
 
 技术分享
 
在这里采用一种方式生成随机数
技术分享
其中i=1,2,3.。。。
而pi就是地推倒的第i个随机数
 
根据经验,一般选取基数base=256.0,一般为2的整数倍;另外的两个常数选取a=17.0 和b=139.0
 
需要注意
(1)这里的取模运算是针对浮点型数据的,而c语言中的取模运算不能用于浮点数数据的操作,这样就需要用户自己编写取模的程序;
(2)ri是随着递推而每次更新的。因此,如果将这个算法编写出函数,需要考虑参数是传值还是传地址;
 
递推更新,所以在这里要传地址,否则得不到结果!

 

#include <stdio.h>double rand0_1(double *r){    double base=256.0;    double a=17.0;    double b=139.0;    double temp1=a*(*r)+b;    //printf("%lf",temp1);    double temp2=(int)(temp1/base); //得到余数    double temp3=temp1-temp2*base;    //printf("%lf\n",temp2);    //printf("%lf\n",temp3);    *r=temp3;    double p=*r/base;    return p;}int main(){    double r=5.0;    printf("output 10 number between 0 and 1:\n");    for (int i = 0; i < 10; i++)    {        printf("%10.5lf\n",rand0_1(&r));    }    return 0;}

 

 

3 产生任意范围内的随机数,比如产生[m,n]之间的随机数
这个很容易,只要将之前的[0,1]之间的随机数这样处理就行了
m+(m-n)*rand0_1(&r)就行了;
 
#include <stdio.h>double rand0_1(double *r){    double base=256.0;    double a=17.0;    double b=139.0;    double temp1=a*(*r)+b;    //printf("%lf",temp1);    double temp2=(int)(temp1/base); //得到余数    double temp3=temp1-temp2*base;    //printf("%lf\n",temp2);    //printf("%lf\n",temp3);    *r=temp3;    double p=*r/base;    return p;}int main(){    double m=1.0,n=5.0;    double r=5.0;    printf("output 10 number between 0 and 1:\n");    for (int i = 0; i < 10; i++)    {        printf("%10.5lf\n",m+(n-m)*rand0_1(&r));    }    return 0;}

 

4 正态分布的随机数生成算法
 
符合正太分布的随机数在研究中也很重要,下面给出一种生成正态分布数的方法

技术分享

 

其中Ri表示[0,1]之间均匀分布的随机数;
 
u为均值,技术分享技术分享  为方差,当n趋向于无穷大的时候,得到随机的随机分布为正态分布;

 

#include <stdio.h>#include <math.h>double rand0_1(double *r){      double base=256.0;      double a=17.0;      double b=139.0;      double temp1=a*(*r)+b;      //printf("%lf",temp1);      double temp2=(int)(temp1/base); //得到余数      double temp3=temp1-temp2*base;      //printf("%lf\n",temp2);      //printf("%lf\n",temp3);      *r=temp3;      double p=*r/base;      return p;}double random_normality(double u,double t,double *r ,double n){      double total=0.0;      double result;      for (int i = 0; i < n; i++)      {            total+=rand0_1(r);      }      result=u+t*(total-n/2)/sqrt(n/12);      return result;}int main(){      double r=5.0;      double u=2.0;      double t=3.5;      double n=12;      printf("output 10 number between 0 and 1:\n");      for (int i = 0; i < 10; i++)      {            printf("%10.5lf\n",random_normality(u,t,&r,n));      }      return 0;}

 

上面设计的代码都已经运行通过!
 

 

 

 

算法1---随机生成算法