Algorithm 生成不在一组数N中的随机数R的最优算法

Algorithm 生成不在一组数N中的随机数R的最优算法,algorithm,random,set,Algorithm,Random,Set,我很想知道生成随机整数R的最佳方法是什么,它不在所提供的整数集(R)中∉N) 。我可以想出几种方法来实现这一点,但我想知道你们都是怎么想的。在整个域中生成一个随机数R(从最大值中减去N的大小)。然后循环遍历小于R的所有N,并为每个N加1。这将在域中给出一个不在N中的随机数。设N为整个集合的大小,K为排除集合的大小 我取决于你从中采样的集合的大小。如果排除集远小于整个范围,只需选择一个随机数,如果它在排除集中,请再次选择。如果我们将排除集保留在哈希表中,则每次尝试都可以在O(1)时间内完成 如果排

我很想知道生成随机整数R的最佳方法是什么,它不在所提供的整数集(R)中∉N) 。我可以想出几种方法来实现这一点,但我想知道你们都是怎么想的。

在整个域中生成一个随机数R(从最大值中减去N的大小)。然后循环遍历小于R的所有N,并为每个N加1。这将在域中给出一个不在N中的随机数。

设N为整个集合的大小,K为排除集合的大小

我取决于你从中采样的集合的大小。如果排除集远小于整个范围,只需选择一个随机数,如果它在排除集中,请再次选择。如果我们将排除集保留在哈希表中,则每次尝试都可以在O(1)时间内完成

如果排除的集合很大,则在大小(N-K)的集合中选择一个随机数R,并将该选择作为非排除元素的成员输出。如果我们只在散列表中存储用随机数的值键控的孔,我们可以在时间O(1)的一个样本中生成它


截止点将取决于(N-K)/N的大小,但我怀疑,除非它大于0.5左右,或者你的集合非常小,否则在实践中,只需采样直到你得到一个命中就会更快

给出您有限的描述?查找N中元素的最大值。仅生成大于该值的随机数。

这不是真正的随机生成,因为它将对N中元素附近的边数进行加权。不,不会,因为无论是否存在冲突,它都会将R加1。是,这就是为什么它会在边缘附近结束-你的R更可能是N集合中正上方的一个,而不是不是不是-两倍的可能性。将一个数字打在另一个数字的正上方会变成2/P,其中P是可用的整个数字集,而所有其他数字都会是1/P。如果你在一行中有数字,比如说2,3,4,那么对于一行中的每一个数字,在第一个数字之后,打在它上面的数字(本例中为4)的几率会增加1/P(在我的例子中是4/P)。事实上,murgatroid99是正确的。想象一组不是N的数字。它的大小是K-N。现在,为这个集合生成一个随机索引。最后,你需要对它进行计数,这只是跳出了洞,这正是murgatroid99的建议。不过,应该写得更清楚一些;也许:“循环递增排序的集合N,每个元素加1到R,直到下一个元素大于R。”这取决于集合的离散程度。哪一个更像您想要的?:(1)生成1到50之间的随机整数,而不是4、5或6或(2)生成一个介于0.0和1.0之间的随机双精度,但不是介于0.1和0.2之间。很抱歉,我没有澄清这一点。R是一个整数,N中的每个数字都是一个整数。原则上回答得很好,但我不确定0.9的阈值——我认为在许多情况下它可能会显著降低,并且在0.5左右会开始感到非常不安s您只能在应用程序中测试它,但如果有疑问,我更喜欢确定性运行时。没有理由为此使用树。如果您不知道所有漏洞是什么,则采样比构建树更快。如果您知道,您应该使用该时间而不是树来构建哈希表。@Svante:Random running time是not一些值得害怕的东西…即使系数为0.9,预期的试验次数也只有10次。@chuck是的。我会解决它的。Doh!@Svante.9可能比实际的要大,特别是现在我意识到不再需要O(lg n),但具有非平凡失败率的随机算法是非常可行的。