如何有效地从所有组合中随机选择多个组合

时间:2018-05-25 14:24:43

标签: javascript arrays random unique combinations

例如,我有两个数组(第一个数组包含名字和第二个数组姓)。我想从这两个数组生成n个唯一的,非重复的组合,这样的排序>>> first_name +' ' + last_name。

我不希望事先生成所有可能的组合,因为它耗费了大量的内存。

所以我认为该算法应该做的是迭代直到组合没有生成,在迭代期间,它应该为两个数组提供一些随机索引,如果这些索引已经一起使用,尝试选择另一个随机数,直到唯一索引没有生成。 但是这种方法可能会在运行时触发深度递归,因为已经给出了很多输出,新的随机索引与现有索引匹配的可能性在每一步都会更高。

那么你的建议是什么,如何以非常优化的方式从非现有/虚拟2数组元素组合中选择随机,唯一的n项

1 个答案:

答案 0 :(得分:0)

如果你有F个唯一的名字和L个唯一的姓氏,那么组合的总数是N = F * L

因此,您可以在范围0..N-1中生成所需数量的非重复随机整数值(例如,使用Fisher-Yates采样),对它们进行排序,并获得相应的名称组合:

for i = 0..M-1
    Generate K[i] = Random(N)
Sort K[]
for i = 0..M-1
   FirstNameIndex = K[i] / L    //integer division
   LastNameIndex = K[i] % L     //integer modulo
   Combination[i] = First[FirstNameIndex] + Last[LastNameIndex]