C++ 程序实现 Park-Miller 随机数生成算法2024 年 8 月 29 日 | 阅读 3 分钟 包括计算机模拟、游戏、密码学、统计抽样等在内的众多应用程序都需要生成随机数的能力。计算机只能使用数学公式计算随机数,而不能自己生成“真正”的随机数。这些通过算法计算出的随机数被称为伪随机数。 Park-Miller 算法由 Stephen Park 和 Keith Miller 于 1988 年发布。它是计算机程序中生成伪随机数的一种流行方法。即使在 30 多年之后,该算法仍然非常易于编写代码且高效。 首先,我们选择一个任意的数字,称为“种子”值。这个种子可以是任何随机选择的数字,它允许我们初始化随机数生成。从这个初始种子开始,Park-Miller 公式计算序列中的下一个随机数,然后将该数字用作种子来计算下一个。 公式如下:在公式中,16807 和 2^31 - 1(与 2147483647 相同)是常数素数。我们举个例子: 种子 = 5 下一个随机数 = (16807 * 5) % 2147483647 = 1043618065 现在,1043618065 成为生成序列中下一个数字的种子。重复此计算会给我们带来一个不错的随机模式,即使这些数字在技术上是伪随机的。 通过这个简单的算法,我们可以在 C++ 程序中获得一系列漂亮的伪随机数。通过不可预测地改变种子值,随机性会得到改善。它可以在许多应用中实际使用,如模拟、游戏、测试、采样等。然而,编码仍然简单、高效且跨平台可移植。因此,Park-Miller 至今仍是 C++ 开发人员的热门选择。 算法的正确步骤以下是实现 Park-Miller 随机数生成算法的简单步骤: 1. 选择一个种子值 首先,我们必须选择一个整数作为种子值。这个种子可以是任何随机选择的数字。一个常见的选择是简单地从 seed = 1 开始。 2. 初始化变量 声明一个名为“seed”的变量,并用我们在步骤 1 中选择的种子值对其进行初始化。此外,还需要一个变量“next_random”来存储生成的下一个随机数。 3. 定义生成器函数 之后,我们需要一个函数,每次调用它时都会计算并返回下一个随机数。我们将其命名为 get_next_random_number()。 4. 应用公式 在函数内部,应用 Park-Miller 公式 它从之前的种子生成一个介于 0 和 2147483647 之间的随机整数。 5. 更新种子 现在,用上面计算出的下一个随机数替换旧的种子。 seed = next_random 6. 返回数字 最后,从函数返回next_random,以便在我们的程序中使用。 7. 调用函数 在循环中或在需要的地方调用get_next_random_number()以不断获取更多随机数。 因此,通过 7 个简单的步骤,我们可以使用这种可靠且经过测试的算法生成一系列漂亮的随机数。 示例让我们来看一个用 C++ 程序实现 Park-Miller 随机数生成算法的例子。 输出 Park-Miller Random Numbers: 165394961 1229862357 2064994670 622466744 51635271 1328980414 1729261113 2098655378 1808216131 404005600 下一主题C 和 C++ 中的字符算术 |
在 C++ 中解决不同函数局部变量的检索问题很重要,它是程序变量作用域、函数调用和数据共享的核心。在 C++ 中,局部变量只能在特定的代码块内声明,通常在特定函数的函数体中...
阅读 8 分钟
String::npos 是 C++ 中 std::string 类的一个静态成员常量。它代表可以创建的最大 std::string 对象。在使用字符串相关操作(如查找子字符串或字符)时,此值通常用于表示没有有效位置……
阅读 4 分钟
Boost C++ 库是一系列免费开源库,为 C++ 程序员提供了广泛的功能。Boost 旨在补充 C++ 标准库并添加其缺失的功能。Boost 是一个社区驱动的项目,该项目...
阅读 4 分钟
C++ 中的有序映射是一种容器,它根据键以排序顺序存储键值对。它实现为一个平衡二叉搜索树,允许高效地访问、插入和删除元素。要使用 C++ 中的有序映射,您需要...
阅读 4 分钟
C++ 编程语言中主要有四种预处理器指令,它们是:- 宏 文件包含 条件编译 其他指令 宏 C/C++ 编程语言中的宏是最令人兴奋的概念之一。它们是用 #define 编写的 C++ 代码中的句子,每当...
阅读 3 分钟
在本文中,我们将编写一个程序来合并两个未排序的数组。输出是升序排序的数组。输入:a[] = {10, 5, 15} b[] = {20, 3, 2} 输出:合并后的排序数组 {2, 3, 5, 10, 15, 20} 输入:...
阅读 4 分钟
在本文中,我们将讨论 C++ 中 std::upper_bound 和 std::set::upper_bound 方法之间的区别。但在讨论它们的区别之前,我们必须先了解 std::upper_bound 和 std::set::upper_bound 方法及其语法和示例。什么是 std::set::upper_bound?它是 std::set 容器类的一个成员函数...
阅读 4 分钟
什么是“不透明指针”?顾名思义,不透明意味着我们看不透。例如,木材是不透明的。不透明指针是指向一个数据结构的指针,该数据结构的成员在定义时是未知的。该指针之后...
阅读 3 分钟
本文旨在介绍 C++ 编程语言的标准模板库,其中我们已经看到了操作函数的用法。由于 C++ STL 浩瀚如海,本文讨论了一些关键函数,如 merge()、operator"="、sort()、unique()、...
阅读 3 分钟
?本节将讨论 C++ 编程语言中两个或多个字符串的连接。字符串的连接意味着将两个或多个字符串组合起来,返回一个连接后的单个字符串。在连接字符串时,第二个字符串被添加到…
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India