【问题标题】:How to randomly pick a number of combinations from all the combinations efficiently如何有效地从所有组合中随机选择多个组合
【发布时间】:2018-11-04 23:37:04
【问题描述】:

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

我不希望预先生成所有可能的组合,因为它太消耗内存了。

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

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

【问题讨论】:

标签: javascript arrays random unique combinations


【解决方案1】:

如果您有 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]

【讨论】:

  • 谢谢,我最终得到了完全相同的解决方案。当然,它也有缺点,我们生成整个长度的数组,然后对其进行洗牌,但无论如何这是最佳解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2020-10-27
  • 2010-09-08
  • 2023-03-11
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多