C++随机数生成

一般要用到两个头文件

随机整数数
#include<stdlib.h>
#include<time.h>

首先生成一个0-rand_max的随机数:

#include<iostream>
#include<stdlib.h>
int void(){
int i;
i=rand()
cout<<i<<endl;
return 0;
}

输出:

1894357422

注意这里无论运行多少次随机数都一样,这是由于没有设置随机数种子的原因。

设置随机数种

使用srand(usigned int)设置随机数种子,参数是一个无符号整数。

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main(){
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<=10;i++){
    cout<<rand()<<endl;
  }
return 0;
}

输出:

487353927
1611550431
784589536
1486413294
1935360489
1822850335
918443810
1851401880
899173349
579650615
487488736

输出指定范围的随机数

x = rand()%11; /产生1~10之间的随机整数/

y = rand()%51 - 25; /产生-25 ~ 25之间的随机整数/

z = ((double)rand()/RAND_MAX)*(b-a) + a;/产生区间[a,b]上的随机数/
通用:
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
eg:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
    int i,j;
    srand((unsigned)time(NULL));
    for(i=0;i<=10;i++){
        cout<<rand()%11<<endl;
    }
    return 0;
}

输出:

4
0
3
9
9
3
3
6
4
10
3

eg:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
    int i,j;
    srand((unsigned)time(NULL));
    for(i=0;i<=10;i++){
        cout << rand()/(double)(RAND_MAX)<< endl;
    }
}

这里的解释就是rand()产生的是0-RAND_MAX之间的数,所以除以RAND_MAX就是0-1之间的数。

正太分布随机数
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<math.h>
using namespace std;
double gaussrand()
{
    static double V1, V2, S;
    static int phase = 0;
    double X;
     
    if ( phase == 0 ) {
        do {
            double U1 = (double)rand() / RAND_MAX;
            double U2 = (double)rand() / RAND_MAX;
             
            V1 = 2 * U1 - 1;
            V2 = 2 * U2 - 1;
            S = V1 * V1 + V2 * V2;
        } while(S >= 1 || S == 0);
         
        X = V1 * sqrt(-2 * log(S) / S);
    } else
        X = V2 * sqrt(-2 * log(S) / S);
         
    phase = 1 - phase;
 
    return X;
}
int main(){
    int i,j;
    srand((unsigned)time(NULL));
    double sum=0,RND;
    for(i=0;i<100000;i++){
        RND=gaussrand();
        cout << RND<< endl;
        sum+=RND;
    }
    cout<<"平均:"<<sum/100000<<endl;
    return 0;
}

这样生成的高斯分布随机数序列的期望为0.0,标准差为1.0。若指定期望为E,标准差为V,则只需增加:
X = X * V + E;(由Marsaglia和Bray在1964年提出)
还有Box–Muller transform将均匀分布转换为正太分布。
有一个称为 Box-Muller (1958) 转换的算法能够将两个在区间(0,1] 的均匀分布转化为标准正态分布。原理是这样 U 1 U_1 U1, U 2 U_2 U2是两个 相互独立的 ( 0 , 1 ) (0, 1) (0,1)之间的均匀分布的样本。则通过下面两个公式可以转换为 标准的正太分布,均值为0,方差为1:
在这里插入图片描述在这里插入图片描述
这里 Z 0 Z_0 Z0 Z 1 Z_1 Z1是相互独立的标准正太分布

  • 32
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值