如何随机分组两个列表的元素并创建随机获得的新元素的元组的新列表?

时间:2021-06-09 19:26:31

标签: random ocaml shuffle

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

1 个答案:

答案 0 :(得分:0)

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

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

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

相关问题