随机数生成算法(整数、小数和正态分布)(附代码)

首先定义RandomNumber类的时候,我们就定义了一个构造函数,每次调用就会产生随着系统时间变化的随机种子,这样我们就可以避免生成伪随机数,小数和整数随机数的生成比较好理解,而服从正态分布的随机数本文采用的是Box–Muller算法,它可以通过两个服从(0,1)均匀分布的随机数构造服从正态分布的随机数。

Box-Muller算法

当x和y是两个独立且服从(0,1)均匀分布的随机变量时,有

                                             Z_{1}=cos(2\pi x)\cdot \sqrt{-2ln(y)}

                                            Z_{2}=sin(2\pi x)\cdot \sqrt{-2ln(y)}

Z1和Z2独立且服从标准正态分布,当带入均值和方差时,

                                                 Z=Z_{1}(Z_{2})\cdot \sigma +\mu

Z就可以产生服从(μ,σ2)正态分布的随机数,本文采用的是Z1。

实例

设置随机产生20组(-100,100)的整数,(0,1)的小数,服从(0,1)正态分布的随机数

c++代码

#include <iostream>
#include <ctime>
#define  PI    3.1415926535897    //π值
using namespace std;
//==========================随机产生均匀分布的小数、整数和服从高斯分布的随机数=========================
class RandomNumber
{
public:
	RandomNumber() {
		srand((unsigned)time(NULL));    //析构函数,在对象创建时数据成员执行初始化操作
	}
	int integer(int begin, int end)
	{
		return rand() % (end - begin + 1) + begin;
	}
	double decimal(double a, double b)
	{
		return double(rand() % 10000) / 10000 * (b - a) + a;
	}
	double GaussianNoise(double mu, double sigma)
	{
		return sigma * sqrt(-2 * log(decimal(0, 1)))*cos(2 * PI*(decimal(0, 1))) + mu;
	}
};
int main()
{
	RandomNumber r;//定义随机数
	cout << "   " << "整数" << "      " << "小数" << "     " << "服从(0,1)正态分布" << endl;
	for (int i = 0; i < 20; i++)
	{ 
		cout << "    " << r.integer(-100, 100) << "      " << r.decimal(0, 1) << "        " << r.GaussianNoise(0, 1) << endl;
	}
    
}

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值