在一个范围内生成不同的随机数

时间:2013-10-31 14:59:58

标签: c++ c algorithm random

我想在1和N之间生成n个不同的数字(当然n <= N)。 N可能非常大。 如果n非常小,一种有效的方法是生成数字并将其与我们必须确保它是新数字的集合进行比较。它需要O(n ^ 2)时间和O(n)内存。 如果n非常大,我们可以使用Fisher-Yates shuffle算法生成随机置换(在n步之后停止)。它需要O(n)时间,但我们也必须使用O(N)存储器。

这是一个问题。如果我们不知道n有多大,我们该怎么办? 我希望算法只使用O(n)内存并在O(n)时间后停止。这可能吗?

1 个答案:

答案 0 :(得分:0)

你可以基本上和非常小的 n 一样,但只是让检查更有效率。例如,检查您是否已生成数字的天真方法是直接搜索先前生成的值列表。对于未知的 n ,您可以对先前生成的值进行排序,以便您可以使用更有效的搜索来识别重复项。使用天真的方法,算法需要O(n 2 )时间,但通过以前的结果更智能的搜索可以将其减少到O(n * log 2 n)。