2011-12-18 101 views
1

我想在C中创建一个函数。它将返回一个范围为N的随机整数,如下所示: - rand()%N; 但事情是我想跟踪唯一性。我不希望数字重复。但我也可以通过创建一个数组并将其中生成的整数复制来做到这一点。如: - array[count] = rand() % N;并每次检查生成的数字是否已经在其中。 (只需在数组[]中搜索它);这是一个简单的方法,但是一个正确的方法。它会采取许多如果和为了;为此工作。 这是我能想到的最好的。生成非重复的随机数


的事情是,我想这个问题的最佳/优化的解决方案。什么将是最有效的方式来做到这一点?

允许明确一些事情: - 我想从一个NSArray中,始终是唯一坐落在一个UILabel一些文本。我的NSArray从Plist获取数据,而我的Plist有超过1000个条目。如果我想这样做很多次,它会影响性能,所以我想要一些有效的方式来做到这一点。

+4

如果它保证没有重复不再是随机的,是不是逻辑? – 2011-12-18 19:47:18

+1

同一句子中的“随机”和“唯一”不属于。你试图解决的问题究竟是什么? – Jon 2011-12-18 19:47:27

+0

可以说我想填充一个数组,直到100的随机数,或另一个iPhone开发的例子是,我从1000个对象的NSArray标签中显示随机对象。 – SAQIBZAFAR 2011-12-18 19:50:59

回答

6

这听起来像你想要的是真正的数字1..N的随机排列。所以,用一个连续的整数1..N填充一个数组,然后对数组进行洗牌。有well known algorithms for shuffling,你可以查找。

1

使用某种散列表来存储已经生成的号码并快速检查已经看到的号码。我不知道你在做什么,但是因为你需要独特的兰特,我想你正试图对一个有限集进行排列,如果是这样的话,看一下Shuffling Algorithms

+0

肯定是一种可能性.. – SAQIBZAFAR 2011-12-18 19:53:02

1

而不是一个数组,你可以使用超快速高效的bloom filter。如果你正在生成大量的数字,这将比在数组中循环更快。

+0

谢谢,我必须为iPhone设计它还是有一个类为我实现它,我可以直接使用它? – SAQIBZAFAR 2011-12-18 19:57:28

+0

Apple没有提供这样的构造。虽然可能有图书馆可以在某处使用。我从来没有使用过自己,所以不能提供更多建议。 – 2011-12-18 20:35:35

1

四个选项,所有这一切都是Ø(1)在内存和时间:

  1. 只是增加一个全局计数器。既然你想要唯一性,无论如何你都不能生成随机数。
  2. 从一个足够大的集合中生成一个数字,以至于很难重复一个数字。 64位足以支持应用内唯一性;全局唯一性足够128位。这是UUID的工作方式。
  3. 如果选项1对您来说不够“随机”,则使用全局(32位)计数器的CRC-32散列值。 N比特整数与它们的CRC-N之间有1对1的映射(双射),所以唯一性仍将得到保证。
  4. 使用Linear Feedback Shift Register生成数字。这些是N位计数器,它们看起来是“随机的”(尽管显然是确定性的)模式。出于您的目的,这基本上是选项3的适度更快的版本。
0

所描述的算法非常糟糕,因为它会针对每个新条目搜索新数组。这意味着随着数组的增长,它必须搜索越来越多的数据,更糟糕的是,随着剩余数量的减少,它将最终循环更多。

例如,如果您有一个1 ... 10的列表,那么当您填充了八个项目时,现在只剩下两个项目(比如说7和9),每次生成一个随机数字时在80%的时间内生成非唯一编号,并且必须在检测到重复项之前扫描至少六个条目。

有可能是一些在一些图书馆,甚至更好的方法,但比在问题的更好的办法是创建项目的(链接)列表中,随机挑选一个,删除它,并将它添加到新的名单。这样,每次你随机挑选一个,它就会保证是唯一的,因为所使用的不再在池中。