C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++随机数现代化封装

C++实现随机数生成的现代化封装

作者:T0uken

在现代 C++ 中,随机数生成是许多程序设计中不可或缺的部分,例如游戏开发、算法设计、统计模拟等,本文将以一个封装好的随机工具类 Random 为例,深入剖析其功能的实现与使用,并引入相关知识,帮助读者触类旁通,掌握 C++ 随机数的核心技巧

背景知识

随机数的生成

C++ 的标准库提供了一套强大且灵活的随机数工具,主要通过以下几部分组成:

类的设计原则

在设计一个通用的随机工具类时,我们可以封装常见的随机操作,例如:

类定义与功能分解

以下是 Random 类的完整定义:

#include <chrono>
#include <iostream>
#include <random>
#include <algorithm>

struct Random {
    std::mt19937 rnd;

    Random()
        : rnd(std::chrono::steady_clock::now().time_since_epoch().count()) {}
    
    void setSeed(unsigned int seed) {  
        rnd.seed(seed);  
    }

    int operator()(int l, int r) {
        return std::uniform_int_distribution(l, r)(rnd);
    }

    double operator()(double l, double r) {
        return std::uniform_real_distribution(l, r)(rnd);
    }

    bool operator()(double p) {
        return std::bernoulli_distribution(p)(rnd);
    }

    template<typename T>
    void operator()(std::vector<T>& vec) {  
        std::shuffle(vec.begin(), vec.end(), rnd);  
    }
};

下面,我们逐一拆解并讲解其核心部分。

随机数引擎的初始化

Random()
    : rnd(std::chrono::steady_clock::now().time_since_epoch().count()) {}

设置随机数种子

void setSeed(unsigned int seed) {  
    rnd.seed(seed);  
}

生成随机整数

int operator()(int l, int r) {
    return std::uniform_int_distribution(l, r)(rnd);
}

示例:

Random random;
int number = random(1, 10); // 生成 [1, 10] 范围内的随机整数

生成随机浮点数

double operator()(double l, double r) {
    return std::uniform_real_distribution(l, r)(rnd);
}

示例:

Random random;
double value = random(0.0, 1.0); // 生成 [0.0, 1.0) 范围内的随机浮点数

按概率生成布尔值

bool operator()(double p) {
    return std::bernoulli_distribution(p)(rnd);
}

示例:

Random random;
bool result = random(0.7); // 70% 概率返回 true,30% 概率返回 false

随机打乱容器

template<typename T>
void operator()(std::vector<T>& vec) {  
    std::shuffle(vec.begin(), vec.end(), rnd);  
}

示例:

Random random;
std::vector<int> vec = {1, 2, 3, 4, 5};
random(vec); // 随机打乱 vec

使用场景

随机分配任务

假设有 10 个任务需要随机分配给 3 名员工:

Random random;
std::vector<int> tasks = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
random(tasks);

for (int i = 0; i < tasks.size(); ++i) {
    std::cout << "Task " << tasks[i] << " -> Employee " << random(1, 3) << "\n";
}

模拟抛硬币

Random random;
int heads = 0, tails = 0;

for (int i = 0; i < 100; ++i) {
    if (random(0.5)) {
        ++heads; // 正面
    } else {
        ++tails; // 反面
    }
}

std::cout << "Heads: " << heads << ", Tails: " << tails << "\n";

小结

通过本文的剖析,我们从以下几个方面深入了解了 Random 类的设计与实现:

到此这篇关于C++实现随机数生成的现代化封装的文章就介绍到这了,更多相关C++随机数现代化封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文