前言
之前写代码的时候发现,我们在C++中调用的rand函数返回的随机数随机性有些许不足。随机数的质量比较差,并且范围有限,甚至有概率被预测,如果在部分应用场景下(如点名器、随机抽奖等)使用系统自带的random函数,可能会导致有些情况下有失公平(比如点名字经常性的点中一个人,有些人非常难以点中,抽奖程序中有些人的概率会比别人高很多。所以我需要想一种方法让其生成的随机数近似于均匀分布。
生成代码
//
// Created by q2019 on 2024-10-31.
//
#include <iostream>
#include <random>
using namespace std;
int get_uniform_random_number(int a,int b) {
// 1. 创建随机数生成器,使用系统时钟作为种子
random_device rd; // 获得随机数种子
mt19937 gen(rd()); // 使用Mersenne Twister引擎
// 2. 定义均匀分布范围,例如生成1到100之间的整数
uniform_int_distribution<> dis(a, b);
return dis(gen);
}
int main() {
int total[100] = {0};
for(int i=0;i<=10000000;i++) {
total[get_uniform_random_number(1,100)-1]++;
}
for(int i=0;i<99;i++) {
cout<<total[i]<<endl;
}
return 0;
}
上方的代码便是一种生成一种伪随机数的代码
std::random_device:用于生成随机种子。
std::mt19937:选择随机数引擎,这里选择的是 Mersenne Twister 算法。
std::uniform_int_distribution<>:定义了一个均匀分布生成器,范围为 [1, 100],可更改。
dis(gen):调用生成器生成随机数。
这个代码便能更好的生成随机函数。