1. 功能概述
1.1 功能效果
常用的随机数产生方法之一。
1.2 使用方法
- 输入要求:均匀分布输入最大最小值,高斯分布输入均值和标准差,SetSeed(2)设置固定种子,SetSeed(“unconst”)设置随机种子;
- 输出结果:
2. 注意事项
- rand()返回[0, RAND_MAX]之间的随机数,包括0和RAND_MAX;
- 均匀分布左右极限根据自己需要修改,假设左右极限为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) - 采用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;
}