随机数生成(均匀分布、正态分布、C++)
一、生成均匀分布的随机数1. rand生成的随机数在0到RAND_MAX(2147483647)之间,在stdlib中定义,使用 % 结合 / 可生成某个范围内的随机数,但是这里生成的随机数是唯一确定的。#include <iostream>int main () {for (int i = 0; i < 10; ++i) {std::cout << rand() &
一、 生成均匀分布的随机数
1. rand
生成的随机数在0到RAND_MAX(2147483647)之间,在stdlib中定义,使用 % 结合 / 可生成某个范围内的随机数,但是这里生成的随机数是唯一确定的。
#include <iostream>
int main () {
for (int i = 0; i < 10; ++i) {
std::cout << rand() << std::endl;
}
return 0;
}
2. srand
使用rand函数无法得到变化的随机数,可以使用srand来实现。使用这个srand()函数必须加上头文件 "time.h",需要引入ctime库。其中time(0)是获取从1970年开始的时间(单位:s),然后再获取rand(),这时rand得到的就是随机变化的随机数了。
#include <iostream>
int main () {
srand(time(0));
// srand((unsigned)time(NULL)); // 将rand()函数植入系统时间种子
for (int i = 0; i < 10; ++i) {
std::cout << rand() << std::endl;
}
return 0;
}
3. 生成 0~100 之间的整数随机数
#include <iostream>
int main () {
srand(time(0));
for (int i = 0; i < 10; ++i) {
std::cout << rand() % 100 << std::endl;
}
return 0;
}
4. 生成 0~1 之间的随机数
#include <iostream>
int main () {
srand(time(0));
for (int i = 0; i < 10; ++i) {
std::cout << (rand() % 100) * 0.01 << std::endl;
}
return 0;
}
#include <iostream>
int main () {
srand(time(0));
for (int i = 0; i < 10; ++i) {
std::cout << rand() * 1.0f / RAND_MAX << std::endl;
}
return 0;
}
5. 生成 -1~1 之间的随机数
#include <iostream>
int main () {
srand(time(0));
for (int i = 0; i < 10; ++i) {
std::cout << (rand() % 200) * 0.01 - 1 << std::endl;
}
return 0;
}
二、生成高斯/正态分布的随机数
Box-Muller算法利用均匀分布产生高斯分布随机数,算法如下:
上式中的U1和U2是两个在[0,1)上遵从均匀分布的随机数(生成[0,1)上遵从均匀分布的随机数通常使用的是梅森旋转算法)
经过这样的一种计算之后就能产生一个Z服从均匀分布的随机数,这看起来太神奇了,不得不佩服这个算法。说明一下,上面的三个式子,前两个取任何一个都可以用作算法,取正弦还是余弦是无所谓的。另外一点,上面的式子仅仅只能产生标准的高斯分布,若要产生给定的均值和方差其实也很简单。
Y=u+(Z*sigma)
上式中的u,sigma是自定义的期望和方差。
#include <cmath>
#include <fstream>
int main() {
std::ofstream fout("gauss.txt", std::ios::out);
srand(time(0));
for (int i = 0; i < 10000; ++i) {
double U1 = rand() * 1.0f / RAND_MAX; // 0~1均匀分布
double U2 = rand() * 1.0f / RAND_MAX; // 0~1均匀分布
double Z = sqrt(-2 * log(U1))*cos(2 * M_PI * U2);// 均值为0,方差为1的正态分布
double Y = 1 + 2 * Z; // 均值为1,方差为4的正态分布
fout << Y << "\n";
}
return 0;
}
可视化
import matplotlib.pyplot as plt
import numpy as np
data=list()
for line in open('gauss.txt', 'r'):
d = float(line)
data.append(d)
print(data)
bins=np.arange(-10, 10, 0.5)
plt.hist(data, bins, color='fuchsia', alpha=0.5)
plt.xlabel("range")
plt.ylabel("count")
plt.title("histogram")
plt.show()
更多推荐
所有评论(0)