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

news2024/11/17 5:22:05

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

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

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

#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循环测试多次运行,代码运行结果如下:

#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;
}

代码运行结果示例如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.

.vue文件被标识红色波浪线&#xff1b;提示&#xff1a; HelloWorld is declared but its value is never read. 问题原因&#xff1a; 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件&#xff0c;进行禁用或卸载&#xff1b; 2、在 VScode扩展里面搜索并下载…

NO.08 MyBatis创建逆向工程

目录 1、前言 2、添加依赖和插件 3、创建MyBatis的核心配置文件 4、创建逆向工程的配置文件 5、执行MBG插件的generate目标 1、前言 工程的创建有正向工程和逆向工程之分。正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表&#xff0c;如…

Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘

前言 前几天一个朋友去义乌旅游&#xff0c;带回来很多小商品&#xff0c;就是一整个物美价廉&#xff0c;但是为什么线下购物和网购有的时候差别这么大&#xff08;网购经常要退换货啊&#x1f62d;&#x1f62d;&#x1f62d;&#xff09;&#xff0c;为此我萌生了一个想法&…

SQL注入之宽字节注入

文章目录 宽字节注入是什么&#xff1f;注入练习让转义符失效联合查询 代码审计 宽字节注入是什么&#xff1f; 宽字节注入准确来说不是注入手法&#xff0c;而是另外一种比较特殊的情况。宽字节注入的目的是绕过单双引号转义。 宽字节注入是一种绕过单双引号转义的手段&#x…

数学——七桥问题——图论

当涉及数学&#xff0c;有很多不同的话题可以讨论。你是否有特定的数学领域、概念或问题想要了解更多&#xff1f;以下是一些常见的数学领域和主题&#xff0c;你可以选择一个或者告诉我你感兴趣的具体内容&#xff0c;我将很乐意为你提供更多信息&#xff1a; 代数学&#xff…

嵌入式Linux开发实操(十):ADC接口开发

#前言 ADC就是模数转换,可以用来接一些模拟量设备,所谓模拟量就是波形不是方波而是各种包络形状的波形的信号,比如电压、电流等电信号或压力、温度、湿度、位移、声音等非电信号,ADC就是将这些信号转换为数字方波信号,以便于信息传递的。 #ADC硬件设计 key按键连接了AD…

高学历就不会“造假”?

一直以来&#xff0c;学历都是职场的敲门砖&#xff0c;也是一个门槛。对企业的雇佣决策而言&#xff0c;学历有着重要的参考价值。 但是总有一小部分求职者&#xff0c;存在侥幸心理&#xff0c;想凭借假学历升职加薪、牟取利益&#xff0c;给企业带来不少的潜在用工风险。倒…

服务器Linux系统配置mysql数据库主从自动备份

服务器Linux系统配置mysql数据库主从自动备份 当数据内容越来越多的时候&#xff0c;数据库也变得越来越大了。如果不小心误删了&#xff0c;或者被黑主机了&#xff0c;那就什么都没有了。所以数据库的数据怎么能让它不丢失做到万无一失变得尤为重要&#xff01; 我是艾西&a…

(动态规划) 剑指 Offer 47. 礼物的最大价值 ——【Leetcode每日一题】

❓ 剑指 Offer 47. 礼物的最大价值 难度&#xff1a;中等 在一个 m * n 的棋盘的每一格都放有一个礼物&#xff0c;每个礼物都有一定的价值&#xff08;价值大于 0&#xff09;。 你可以从棋盘的左上角开始拿格子里的礼物&#xff0c;并每次向右或者向下移动一格、直到到达棋…

【应用层】网络基础 -- HTTP协议

再谈协议HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见HeaderHTTP周边会话保持 再谈协议 协议是一种 “约定”. socket api的接口&#xff0c;在读写数据时&#xff0c;都是按 “字符串” 的方式来发送接收的(tcp是以字节流的方式发送的&am…

排序—数据结构

文章目录 1.前置知识1.1稳定性1.2内部排序和外部排序1.3是不是比较的排序 2.直接插入排序2.1思想2.2实现2.3时间复杂度和空间复杂度、稳定性 3.希尔排序3.1思想3.2实现3.3时间复杂度和空间复杂度、稳定性 4.选择排序4.1思想4.2实现4.3时间复杂度和空间复杂度、稳定性 5.堆排序5…

基于卷积神经网络的种子等级识别

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期神经网络语音识别系统…

【python零基础入门学习】python基础篇(一)

python基础学习 官方: www.python.org&#xff0c;自行安装&#xff0c;linux上有自带python&#xff0c;win自行安装。 [studentroom9pc01 05]$ python --version Python 2.7.5 #创建虚拟环境&#xff1a; [rootroom9pc01 bin]# pwd /root/nsd1907/bin [rootroom9pc01 bin]…

高质量编程与性能调优实践 性能分析工具pprof

01 高质量编程 1.1 简介 什么是高质量 ——编写的代码能够达到正确可靠、简洁清晰的目标可称之为高质量代码 • 各种边界条件是否考虑完备 • 异常情况处理&#xff0c;稳定性保证 • 易读易维护 编程原则 实际应用场景千变万化&#xff0c;各种语言的特性和语法各不相同 但是高…

1267. 统计参与通信的服务器

这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其他服务…

浪涌保护器防雷应用的行业解决方案

浪涌保护器SPD是一种用于防止电力系统或电子设备受到雷击或其他暂态过电压的损坏的装置。它可以有效地限制或分流过电压&#xff0c;保护被保护设备的安全和正常运行。浪涌保护器在各个行业领域都有广泛的应用&#xff0c;地凯科技将介绍浪涌保护器的主要应用领域&#xff0c;以…

threejs纹理加载(二)

通过threejs提供的加载器我们去加载一些贴图作为几何体的纹理&#xff0c;非常方便。我们以本地一张图片作为例子来实现这个效果&#xff1a; <template><div></div> </template> <script setup> import { ref } from "vue";import …

C++ 编译报错“jump to label”

C 编译报错“jump to label” 分析解决方法如何在Eclipse中添加编译选项 分析 void func() {int a 0;a;goto label; label:int b 0;return; }这样的代码是有问题的&#xff0c;因为C编译规则中&#xff0c;不允许goto后面还有新的变量声明。 解决方法 将所有变量声明放到第…

LTD240次升级 | 栏目介绍可在官微中心管理 • 移动分享页可显示产品图文参数

1、新增一种自定义内容数据类型&#xff0c;可用于服务特色等版块展示 2、Android版App优化首页内容排序 3、新增一款导航模块和一款轮播模块 4、移动分享页支持产品图文参数 5、已知问题修复与优化 01 官微中心 1) 新增自定义内容类型数据管理功能 本次升级中&#xff0c;新…