C++生成近似均匀分布的随机数

前言

之前写代码的时候发现,我们在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):调用生成器生成随机数。

这个代码便能更好的生成随机函数。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,记得载明出处,(期待)。 内容有问题?请点此跟我反馈
上一篇
下一篇