【问题标题】:How to randomly group elements of two lists and make new list of the tuples of randomly gotten new elements?如何将两个列表的元素随机分组并生成随机获取的新元素的元组的新列表?
【发布时间】:2021-06-09 19:26:31
【问题描述】:

如果我有 2 个列表 ['a'; 'b'] 和 [1;2;3;4] 我想得到类似 [('a',2);('a',4);('b',3); ('b', 1)]。所以重点是我需要使用第二个列表的所有元素一次,我可以使用第一个列表中的元素 0 次或更多次......我尝试使用 List.combine 但总是将第一个列表的第 n 个元素与第一个列表的第 n 个元素连接起来第二个和列表也需要具有相同的长度...

【问题讨论】:

  • 你的标题说你想从第一个列表中随机选择。很明显,List.combine 不会立即有用,因为它的行为没有任何随机性。您可以编写一个函数draw n l,它从列表 l 中返回一个包含 n 个随机抽取(带替换)的列表。然后您可以使用List.combine 将随机抽奖与第二个列表结合起来。然而,从长列表中随机抽取是低效的。最好先将第一个列表转换为数组。
  • 是的,我认为更简单的方法是将列表转换为数组并使用Random.int选择随机元素

标签: random ocaml shuffle


【解决方案1】:

对第一组和第二组使用两个映射 (Map.Make(Int).t)。然后使用元素位置作为键从列表中填充第一个映射(代表小组)。使用由Random.bits () 生成的随机密钥填充较大列表中的第二个映射。在发生冲突的情况下,即当生成的密钥已经在映射中时,生成一个新的密钥,直到生成一个新的密钥。

要生成输出列表,折叠第二个映射,并使用Random.int n 从第一个映射中选择元素,其中n 是第一个映射的大小 (Map.cardinal)。

如果您热衷于使用Base,那么您可以考虑使用Array.shuffle 来置换列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多