将未知的 7 化作可期的 10:Rand7() 函数打造 Rand10() 函数**
2023-10-01 22:16:26
引子:从 7 到 10 的概率之旅
在计算机科学中,随机数生成对于许多应用程序至关重要,例如模拟、游戏和密码学。然而,并不是所有的随机数生成器都是平等的。有些生成器可能产生不均匀的分布,而另一些生成器可能速度很慢或难以实现。
在本文中,我们将研究一个有趣且具有挑战性的问题:如何使用仅能生成 1 到 7 之间的随机整数的 Rand7() 函数来实现 Rand10() 函数(生成 1 到 10 之间的随机整数)。我们将探讨两种不同的方法,并比较它们的概率分布和复杂性。
方法一:拒绝采样
拒绝采样是一种常见的技术,用于从特定分布中生成随机数。它的基本思想是生成一个候选样本,然后根据预定义的规则决定是否接受或拒绝该样本。对于 Rand10() 问题,我们可以使用以下步骤:
- 生成两个随机整数 i 和 j,分别介于 1 到 7 之间。
- 如果 i != j,则接受 (i, j) 并计算:result = i + 5 * (j - 1)
- 如果 i = j,则拒绝 (i, j) 并返回步骤 1。
这个过程被称为拒绝采样,因为我们反复生成 (i, j) 对,直到它们满足 i != j 的条件。可以证明,这种方法产生一个均匀分布在 1 到 10 之间的随机整数。
方法二:转换法
转换法是一种更直接的方法,它利用了 Rand7() 函数的周期性。具体步骤如下:
- 生成两个随机整数 i 和 j,分别介于 1 到 7 之间。
- 计算:result = (7 * (i - 1) + j) % 10 + 1
- 返回 result
转换法的关键在于模运算 % 10,它将结果限制在 1 到 10 之间。这种方法也产生一个均匀分布在 1 到 10 之间的随机整数。
概率分布和复杂性
两种方法都产生均匀分布在 1 到 10 之间的随机整数。然而,它们在复杂性上有所不同。
- 拒绝采样: 平均需要 5.2 次尝试才能生成一个随机数。
- 转换法: 每次尝试生成一个随机数。
在时间复杂度方面,转换法更有效,因为它只需一次尝试即可生成随机数。但是,拒绝采样在某些情况下可能更有利,例如当生成随机数的成本远高于检查随机数是否满足条件的成本时。
结语:从 7 到 10 的随机数生成奥秘
通过探索 Rand7() 和 Rand10() 函数,我们揭示了随机数生成背后的迷人世界。拒绝采样和转换法提供了两种不同的方法,可以将一个有限范围的随机数扩展到一个更大的范围。理解这些方法对于解决各种计算机科学问题至关重要,从模拟到密码学。
随着我们对随机数生成奥秘的不断探索,让我们期待发现更多创新和高效的技术,以驾驭不确定的海洋。