随机数生成(均匀分布、正态分布、C++)

一、 生成均匀分布的随机数

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()

猜你喜欢

转载自blog.csdn.net/A_L_A_N/article/details/108853156