C++ 程序实现 Park-Miller 随机数生成算法

2024 年 8 月 29 日 | 阅读 3 分钟

包括计算机模拟、游戏、密码学、统计抽样等在内的众多应用程序都需要生成随机数的能力。计算机只能使用数学公式计算随机数,而不能自己生成“真正”的随机数。这些通过算法计算出的随机数被称为伪随机数

Park-Miller 算法Stephen ParkKeith Miller1988 年发布。它是计算机程序中生成伪随机数的一种流行方法。即使在 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