随机生成n个唯一数字

时间:2013-05-20 04:14:51

标签: c++ random shuffle

如果我想生成0到999之间的1000个数字,这些数字是唯一的,我该怎么办? 我的第一次尝试是创建一个数组{0,1,2,...,999}并使用std::random_shuffle来重新排列它们。但是,由于我必须在长循环中生成数字,让我们说O(10 ^ 7),这种方法将压倒运行时间。
有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:5)

如果您保存了1000个数字的数组,并且每次需要在循环中调用std::random_shuffle,这实际上是您能够以您需要的方式生成1000个随机唯一数字的最快方式。您不需要每次都重新创建数组。

如果你的循环有O(10 ^ 7)次迭代并不重要,因为如果要按照你所说的那样使用这1000个整数,那么它就需要O(n)运算才能遍历在使用它们时,通过这些数字。 std::random_shuffle时间复杂度也是O(n),所以它不会让你慢下来。

答案 1 :(得分:1)

您要求shuffle的实施(这是您的要求的准确描述),这将比标准库中的更好。这是一个很长的镜头。

但我会试试。我会说:用10 ^ 7这样的排列准备一个文件,并从中读取。确保以某种方式预取,否则肯定会变慢。如果你在不同的线程中预取,它实际上可能更快。但这只是一个疯狂的猜测。

当我考虑它时,如果你可以运行多线程,你可以使用一个简单的生产者 - 消费者解决方案。一个线程放置排列,另一个简单地读取它们。

答案 2 :(得分:1)

  1. 将您的号码容器保存到另一个容器C2。

  2. 生成元素的索引以在C1中选择随机元素。每次生成索引时,都要从容器C1中删除它。 这样,下次你会得到唯一的号码。

  3. 一旦C1变空,用C2重新填充C1并转到步骤2.