【发布时间】:2013-12-21 17:55:16
【问题描述】:
给定两个数 m 和 n,m 小于 n,返回一组从 1 到 n 的 m 个随机唯一数。例如,如果您有 m = 6 和 n = 49,这与给出随机彩票号码相同。
这样做的一种方法是使用随机数生成器获取 0 和 1 之间的数字,乘以 n,截断为整数,检查数字是否已经在集合中,如果没有添加到集合中,重复直到我们有 m 个数字.
另一种方法是先创建一个数字1到n的数组,随机重新排列数字,读出前m个数字。
我认为如果 m 比 n 小,第一个更好,例如,如果 m = 1 和 n = 1000000,第一个显然会快得多。但是,如果 m 很大,我认为第二种方法会更好,例如,如果 m = 500000 和 n = 1000000,如果您不断返回已经添加到设置。
我的问题是,是否有一种数学方法可以计算出 m 和 n 之间的关系,以便何时使用一种方法比另一种更有效?
【问题讨论】:
-
你的“随机重新排列数字”的方法是什么?
-
这个问题似乎是题外话,因为它是关于概率分析的。 Mathematics 可能更适合这个问题的某些派生版本。
-
@PaulDraper 可能指的是某些语言中的内置函数,例如 shuffle()。
-
一个提示是,如果 m n/2 我会选择第二个选项。
-
如果 m 超过 n/2,你当然可以使用第一种方法,但取你的集合中没有出现的数字。例如,如果 m = 90 且 n = 100,则使用该方法获得 10 个数字,然后您的 90 个数字都是其他数字。当 m = n/2 时,第一种方法效率最低。
标签: algorithm