c++多种情况不同概率下,在范围内使用随机数

多种情况不同概率下,在范围内使用随机数。比如有5种情况,每种情况的概率不相同,有的概率为25,有的为15.

使用random库的函数来生成随机数。

cpp 复制代码
std::random_device rd;  //产生随机数种子
std::mt19937 gen(rd()); //生成伪随机数,使用rd作为种子
std::uniform_real_distribution<> dist(0, total_weight);  //生成指定范围均匀分布的实数
int random_number = dist(gen);  //调用均匀实数分布生成一个随机数

在五种概率情况下,通过生成随机数从五类中抽取一个随机结果。完整代码如下:

cpp 复制代码
#include <iostream>
#include <random>
#include <vector>


enum EMoonCakePieceType {
    E_PIECE_FLY = 0,    // 碎片1
    E_PIECE_LU = 1,    // 碎片2
    E_PIECE_CROSS = 2,    // 碎片3
    E_PIECE_MIDDLE = 3,    // 碎片4
    E_PIECE_AUTUMN = 4,    // 碎片5
};

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());  // 设置种子

    // 每个字的概率
    std::vector<std::pair<int, int>> words = {{E_PIECE_FLY,    15},
                                              {E_PIECE_LU,     15},
                                              {E_PIECE_CROSS,  25},
                                              {E_PIECE_MIDDLE, 15},
                                              {E_PIECE_AUTUMN, 30}};
    // 计算总权重
    int total_weight = 0;
    for (std::vector<std::pair<int, int>>::const_iterator it = words.begin(); it != words.end(); ++it) {
        total_weight += it->second;
    }
    std::vector<int> chinese;
    std::uniform_real_distribution<> dist(0, total_weight);
    int random_number = dist(gen);

    int result_number = 4;
    int cumulative_weight = 0;
    for (std::vector<std::pair<int, int>>::iterator itb = words.begin(); itb != words.end(); ++itb) {
        cumulative_weight += itb->second;
        if (random_number <= cumulative_weight) {
            result_number = itb->first;
            break;
        }
    }
    std::cout << result_number << std::endl;
    chinese.push_back(result_number);
    std::cout << "生成了:";
    for (auto word: chinese) {
        std::cout << word << " ";
    }  // 测试结果
    std::cout << std::endl;

    return 0;
}

开启个while循环测试多次运行,代码运行结果如下:

cpp 复制代码
#include <iostream>
#include <random>
#include <vector>
#include <thread>


enum EMoonCakePieceType {
    E_PIECE_FLY = 0,    // 碎片1
    E_PIECE_LU = 1,    // 碎片2
    E_PIECE_CROSS = 2,    // 碎片3
    E_PIECE_MIDDLE = 3,    // 碎片4
    E_PIECE_AUTUMN = 4,    // 碎片5
};

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());  // 设置种子

    // 每个字的概率
    std::vector<std::pair<int, int>> words = {{E_PIECE_FLY,    15},
                                              {E_PIECE_LU,     15},
                                              {E_PIECE_CROSS,  25},
                                              {E_PIECE_MIDDLE, 15},
                                              {E_PIECE_AUTUMN, 30}};
    // 计算总权重
    int total_weight = 0;
    for (std::vector<std::pair<int, int>>::const_iterator it = words.begin(); it != words.end(); ++it) {
        total_weight += it->second;
    }
    std::vector<int> chinese;
    while (true) {
        std::uniform_real_distribution<> dist(0, total_weight);
        int random_number = dist(gen);

        int result_number = 4;
        int cumulative_weight = 0;
        for (std::vector<std::pair<int, int>>::iterator itb = words.begin(); itb != words.end(); ++itb) {
            cumulative_weight += itb->second;
            if (random_number <= cumulative_weight) {
                result_number = itb->first;
                break;
            }
        }
        std::cout << result_number << std::endl;
        chinese.push_back(result_number);
        std::cout << "生成了:";
        for (auto word: chinese) {
            std::cout << word << " ";
        }  // 测试结果
        std::cout << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(3));
    }
    return 0;
}

代码运行结果示例如下:

相关推荐
Evand J22 分钟前
【MATLAB例程】到达角度定位(AOA),平面环境多锚点定位(自适应基站数量),动态轨迹使用EKF滤波优化。附代码下载链接
开发语言·matlab·平面·滤波·aoa·到达角度
细节控菜鸡1 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis
Pluto_CSND1 小时前
Java实现gRPC双向流通信
java·开发语言·单元测试
京东零售技术2 小时前
扛起技术大梁的零售校招生们 | 1024技术人特别篇
算法
原来是猿2 小时前
谈谈环境变量
java·开发语言
应用市场2 小时前
本地局域网邮件管理系统:从原理到实现的完整指南
开发语言
Tony Bai2 小时前
【Go 网络编程全解】12 本地高速公路:Unix 域套接字与网络设备信息
开发语言·网络·后端·golang·unix
爱coding的橙子2 小时前
每日算法刷题Day78:10.23:leetcode 一般树7道题,用时1h30min
算法·leetcode·深度优先
Swift社区2 小时前
LeetCode 403 - 青蛙过河
算法·leetcode·职场和发展
地平线开发者2 小时前
三种 Badcase 精度验证方案详解与 hbm_infer 部署实录
算法·自动驾驶