【C/C++学习】均匀分布与高斯(正态)分布随机数

1. 功能概述

1.1 功能效果

常用的随机数产生方法之一。

1.2 使用方法

  1. 输入要求:均匀分布输入最大最小值,高斯分布输入均值和标准差,SetSeed(2)设置固定种子,SetSeed(“unconst”)设置随机种子;
  2. 输出结果:

使用方法

2. 注意事项

  1. rand()返回[0, RAND_MAX]之间的随机数,包括0和RAND_MAX;
  2. 均匀分布左右极限根据自己需要修改,假设左右极限为0和1。
    [0, 1],则ratio = ((double)rand())/(RAND_MAX)
    [0, 1),则ratio = ((double)rand())/(RAND_MAX+1.0)
    (0, 1],则ratio = ((double)rand()+1.0)/(RAND_MAX+1.0)
    (0, 1),则ratio = ((double)rand()+1.0)/(RAND_MAX+2.0)
  3. 采用Bon-Muller法生成高斯随机数,要求均匀分布值域为(0, 1)或(0, 1]。

3. 详细代码

Random.h

/*
* Auther:	 sanfan66
*
* Date        	 | Change
*--------------------------------------------
* 231017   		 | <record>: None→Version 0.0a,Original finished
*                | (describe): Obtain random numbers of Uniform and Gauss
*                | !warning!: Set left and right limits as needed
*/
#pragma once
#include <iostream>//cout
using namespace std;//cout
constexpr auto PI = 3.1415926535897932385;
class Random{
public:
	Random() {};
	~Random() {};
	void SetSeed(const char *mode) const;
	void SetSeed(int num) const;
	double Uniform(double minValue, double maxValue) const;
	double Gauss(double mean, double sigma) const;
};

Random.cpp

#include "Random.h"
#include <ctime>//time 原先 <time.h> 头文件的 C++ 版本
void Random::SetSeed(const char *mode)  const {
	if (strcmp(mode, "unconst") == 0) {
		srand((unsigned)time(nullptr) + (unsigned)rand());
	}
	else {
		cout << "随机数选择:" << mode << "为非法字符,SetSeed选择“unconst”或者整数" << endl;
		system("Pause");
		exit(0);
	}
	return;
}
void Random::SetSeed(int num) const {
	srand(num);
	return;
}

double Random::Uniform(double minValue, double maxValue) const {
	/* rand()返回[0, RAND_MAX] 之间的随机数,包括0和RAND_MAX
		若要取[0, 1],ratio = ((double)rand())/(RAND_MAX)
					[0, 1),ratio = ((double)rand())/(RAND_MAX+1.0)
					(0, 1],ratio = ((double)rand()+1.0)/(RAND_MAX+1.0)
					(0, 1),ratio = ((double)rand()+1.0)/(RAND_MAX+2.0)
	*/
	double ratio = ((double)rand() + 1.0) / (RAND_MAX + 2.0);
	return  ratio * (maxValue - minValue) + minValue;
}

double Random::Gauss(double mean, double sigma) const {
	/* 使用Bon-Muller法生成高斯随机数	*/
	static double U, V;
	static int phase = 0;
	double z;
	if (phase == 0) {
		U = Uniform(0, 1);
		V = Uniform(0, 1);
		z = sqrt(-2.0*log(U))*sin(2 * PI*V);
	}
	else {
		z = sqrt(-2.0*log(U))*cos(2 * PI*V);
	}
	phase = 1 - phase;

	return  mean + sigma * z;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值