当前位置: 首页 > wzjs >正文

云空间的网站网站建设开源模板

云空间的网站,网站建设开源模板,360客户如何做网站推广,百度c2c平台C 中的随机数生成及其应用 在C中,随机数生成可以通过多种方式实现。传统上,C语言风格的随机数生成使用rand()函数,但这种方法存在一些局限性(如随机性不足、需要手动管理种子等)。从C11开始,标准库引入了更…

C++ 中的随机数生成及其应用

在C++中,随机数生成可以通过多种方式实现。传统上,C语言风格的随机数生成使用rand()函数,但这种方法存在一些局限性(如随机性不足、需要手动管理种子等)。从C++11开始,标准库引入了更强大、更灵活的随机数生成机制,位于<random>头文件中。如果你使用的是 GCC 或 Clang 编译器,请确保在编译时启用 C++11 支持。

1. C语言风格的随机数生成使用rand()函数

早期的C语言风格的rand()函数生成的随机数是伪随机数,即通过一个确定的算法从一个初始值(种子)生成的数列。虽然这些数看起来是随机的,但它们实际上是可预测的,因为相同的种子会导致相同的随机数序列。

(1)随机性不足

#include <cstdlib>
#include <iostream>int main() {for (int i = 0; i < 5; i++) {std::cout << rand() << " ";}return 0;
}

你可以试一下,如果多次运行这个程序,每次输出的随机数序列是相同的,因为rand()的种子默认是固定的(通常是1)。这表明rand()生成的随机数可预测性高,不适合对随机性要求较高的场景(如加密、游戏抽奖等)。编译运行效果类似如:

(2)需要手动管理种子

为了避免每次运行程序时生成相同的随机数序列,通常需要手动设置种子。这通常是通过time(0)来实现的:

#include <cstdlib>
#include <iostream>
#include <ctime>int main() {srand(time(0));  // 初始化种子for (int i = 0; i < 5; i++) {std::cout << rand() << " ";}return 0;
}

本例存在问题:

种子设置的局限性:虽然time(0)可以提供不同的种子,但如果程序在短时间内多次运行(例如在同一个秒内),time(0)返回的值可能相同,导致生成的随机数序列仍然相同。

线程不安全:srand()和rand()是全局函数,它们共享同一个种子。在多线程环境中,多个线程同时调用rand()可能导致种子被意外修改,从而影响随机数的生成。

(3) rand() % N 的均匀性偏差问题,使得某些数字出现的概率更高

当使用 rand() % N 生成 [0, N-1] 的随机数时,如果 N 不是 RAND_MAX + 1 的整数因子,会导致某些数字出现的概率更高。

‌具体原因‌:

rand() 的返回值范围是 [0, RAND_MAX](通常 RAND_MAX = 32767)。

当用 rand() % N 时,实际上是将 [0, RAND_MAX] 映射到 [0, N-1]。

如果 RAND_MAX + 1 不能被 N 整除,余数分布会不均匀。

假设 RAND_MAX = 7,生成 [0, 2] 的随机数:

rand() 的输出范围:0,1,2,3,4,5,6,7 → 共 8 个数。

N = 3 → 余数分布:

0,3,6 % 3 = 0 → 概率 3/8

1,4  % 3 = 1 → 概率 2/8

2,5  % 3 = 2 → 概率 2/8

即:

0 的概率是 3/8

1 的概率是 2/8

2 的概率是 2/8

2. C++11开始引入的<random>头文件

从C++11开始,标准库引入了<random>头文件,解决了上述问题。提供了更强大、更灵活的随机数生成机制。它包括:

‌1)多种高质量算法‌引擎,常见的引擎包括:

  • std::default_random_engine:默认随机数引擎。
  • std::mt19937:基于Mersenne Twister(mt19937 梅森旋转)算法的随机数引擎,随机性较好。
  • std::linear_congruential_engine:线性同余随机数引擎,性能较高但随机性稍差。

2)明确分布控制‌(如 uniform_int_distribution 保证均匀性)。常见的分布器包括:

  • std::uniform_int_distribution:生成均匀分布的整数。
  • std::uniform_real_distribution:生成均匀分布的浮点数。
  • std::normal_distribution:生成正态分布的随机数。
  • std::bernoulli_distribution:生成伯努利分布的随机数。

3) std::random_device

std::random_device用于生成高质量的随机种子。std::random_device 是 C++ 标准库 <random> 头文件中定义的一个‌非确定性随机数生成器(Non-deterministic Random Number Generator)‌,其设计目的是提供‌不可预测的高质量随机性‌,通常依赖于底层操作系统的硬件熵源。

使用<random>库生成随机数,示例代码

#include <iostream>
#include <random>int main() {// 随机数引擎std::mt19937 engine(std::random_device{}()); // 使用随机设备生成种子// 均匀分布的整数std::uniform_int_distribution<int> dist(1, 100); // 生成1到100之间的随机整数// 生成10个随机数for (int i = 0; i < 10; ++i) {std::cout << dist(engine) << " "; // 使用分布器和引擎生成随机数}std::cout << std::endl;return 0;
}

编译运行效果类似如:

使用<random>库的优势

  • 更好的随机性:现代随机数引擎(如std::mt19937)提供了高质量的随机性。
  • 灵活的分布:可以生成多种分布的随机数,满足不同需求。
  • 线程安全:每个线程可以独立使用随机数引擎,避免线程间干扰。
  • 可重复性:通过固定种子,可以重复生成相同的随机数序列,便于测试和调试。

在现代C++中,推荐使用C++11引入的<random>库,它提供了更高质量的随机数生成机制,解决了rand()的一些局限性。

3.应用:C++实现小学100以内整数四则运算出题机

以下是一个用C++实现的小学100以内整数四则运算出题机的代码示例。该程序会随机生成加法、减法、乘法和除法题目,确保减法不会出现不够减的情况,除法的结果能够整除。源码如下:

#include <iostream>
#include <random>
#include <chrono>
#include <string>int main() {// 初始化随机数生成器unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();std::mt19937 gen(seed);// 生成10道随机题目for (int i = 0; i < 10; ++i) {std::uniform_int_distribution<> op_dist(0, 3);int operation = op_dist(gen);  // 随机选择运算符int a, b, result;std::string symbol;switch (operation) {case 0: {  // 加法:a + b ≤ 100std::uniform_int_distribution<> a_dist(0, 100);a = a_dist(gen);std::uniform_int_distribution<> b_dist(0, 100 - a);b = b_dist(gen);symbol = "+";result = a + b;break;}case 1: {  // 减法:a ≥ bstd::uniform_int_distribution<> a_dist(0, 100);a = a_dist(gen);std::uniform_int_distribution<> b_dist(0, a);b = b_dist(gen);symbol = "-";result = a - b;break;}case 2: {  // 乘法:a × b ≤ 100std::uniform_int_distribution<> a_dist(1, 100);a = a_dist(gen);std::uniform_int_distribution<> b_dist(1, 100 / a);b = b_dist(gen);symbol = "×";result = a * b;break;}case 3: {  // 除法:商≥2,且被除数 = 除数 × 商std::uniform_int_distribution<> q_dist(2, 50); // 限制商范围int q = q_dist(gen);int max_b = 100 / q;std::uniform_int_distribution<> b_dist(1, max_b);b = b_dist(gen);a = b * q;  // 保证被除数能整除symbol = "÷";result = q;break;}}// 输出题目和答案std::cout << "问题" << i + 1 << ": " << a << " " << symbol << " " << b << " = ?\n";std::cout << "答案" << i + 1 << ": " << result << "\n\n";}return 0;
}

该代码特别适合用于生成小学数学练习题,既能保证题目有效性,又能通过随机性保持练习的新鲜感。

其中,两句:

unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();

std::mt19937 gen(seed);

解释

前一句种子生成

std::chrono::system_clock::now():获取当前系统时间点

.time_since_epoch():计算从"纪元时间"(1970-01-01 00:00:00 UTC)到当前时间的时长

.count():将时长转换为整数形式的纳秒值

作用:用时间戳作为随机数种子,确保每次运行程序生成不同的题目序列

后一句随机数引擎

std::mt19937:基于梅森旋转算法的高质量伪随机数生成器

gen(seed):用种子初始化生成器,相比传统rand()函数具有更好的随机性和更长的周期

编译运行效果如:

OK!


文章转载自:

http://UJHFB0Tz.ydryk.cn
http://gkgsXjYE.ydryk.cn
http://OCglf5r9.ydryk.cn
http://3VJ2qFHu.ydryk.cn
http://M4A8eIAk.ydryk.cn
http://tENBK0QI.ydryk.cn
http://FwPVPfWv.ydryk.cn
http://PpD18bdV.ydryk.cn
http://dmsVrczO.ydryk.cn
http://ICMf0Ldo.ydryk.cn
http://KCqYkRGw.ydryk.cn
http://uckPW3HR.ydryk.cn
http://75ayatA1.ydryk.cn
http://YJn9BOZQ.ydryk.cn
http://DDizcqHB.ydryk.cn
http://JmamyxDt.ydryk.cn
http://ZP88XF8r.ydryk.cn
http://JBWm2YlP.ydryk.cn
http://Fqg9IQzE.ydryk.cn
http://IF2cGAvB.ydryk.cn
http://FiMO5Cq2.ydryk.cn
http://APJrNE2E.ydryk.cn
http://xoGrhkHG.ydryk.cn
http://ssiggNsA.ydryk.cn
http://A9VJTRsZ.ydryk.cn
http://SHrjtvck.ydryk.cn
http://ZUyDQD4a.ydryk.cn
http://GAHijALO.ydryk.cn
http://nKxdP8CO.ydryk.cn
http://3ZTRk2iZ.ydryk.cn
http://www.dtcms.com/wzjs/740525.html

相关文章:

  • 如何为网站添加谷歌分析工具自己建网站开网店
  • 彩票走势图网站建设wordpress文章标题字体大小
  • 电商网站是获取流量怎样申请网站域名
  • 做网站开发的提成多少钱本地运行wordpress
  • 做公司网站需注意什么杭州建设网考试信息网
  • 临清市住房和城乡建设局网站宣传推广方案怎么写模板
  • 房子网站有哪些对于网站建设的提问
  • wordpress显示网站运行贵州建设厅网站
  • 夏天做哪些网站致富附近的小程序怎么开通
  • 做水果生意去那个网站网站介绍ppt怎么做
  • 网站购物车设计广州做韩国网站
  • 商城微网站模板广州商城建网站渠道
  • 江宁网站建设价格百度发布平台官网
  • 怎么进入网站后台图片广州网站案例展示
  • 网站按抓取手机软件贵阳wordpress我的世界主题
  • 网站制作一个人可以做吗哈尔滨网页设计培训
  • 苏州教育平台网站建设WordPress搭建流媒体网站
  • 如何建设一个简单的公司网站怀化政法网站
  • 个人博客网站制作图片做淘宝网店需要多少钱
  • 大城 网站建设注册公司需要登录的网址
  • 网站组网图自己做网站 做什么好
  • 上传的网站打不开公司组织架构图模板
  • 网站左侧分类导航菜单求生之路2怎么做非官方网站
  • 理财网站方案建设湖南公司网站建设
  • 购买域名搭建网站郑州网络运营培训
  • 价钱网站建设站长工具域名查询
  • 如何做本地网站中国建设银行网站主要功能
  • 腾讯云服务器用什么做网站在线网站制作系统源码
  • 江苏建设厅官方网站人工费wordpress 5.1.1主题
  • 专业手机网站设计网站建设图片大全