【发布时间】:2017-03-30 19:13:32
【问题描述】:
我有 2 个列表
s = [1 2 3 4 5]
和
p = [:a :b :c :d :e :f :h :i :j :k :l :m]
我想从 p 中取出 N 个元素,其中 N 是 1 到 K 之间的随机数,并创建一个从 s 到 p 中这 N 个元素的映射。
生成的映射可能类似于
((1 :a) (1 :b) (1 :c) (2 :d) (2 :e) (3 :f) (4 :h) (4 :i) (5 :j) (5 :k) (5 :l))
对于 K=3。
如果不使用 p 中的所有元素也可以,但有足够的元素来覆盖 s 中所有元素的 N 为最大值的情况。
我想出了这个,但它缺少随机 N 个元素部分,并为 s 中的每个元素分配(几乎)相等数量的元素
(partition 2 (interleave (cycle s) (shuffle p))))
这导致
((1 :d) (2 :f) (3 :h) (4 :e) (5 :l) (1 :b) (2 :k) (3 :a) (4 :j) (5 :g) (1 :i) (2 :c) (3 :m))
更新: 让我在问题中添加更多上下文以便更好地理解。 我正在尝试生成一个星系,其中每颗恒星的系统中都有 1 到 N 个行星。 s 列表包含恒星的 id,p 列表包含行星的 id。我想将行星 ID 映射到恒星 ID,以便每个系统在系统中有 1 到 N 个随机行星。
【问题讨论】:
-
我不清楚您希望如何将元素从 s 映射到 p。我也不确定你的第一个例子是否正确。你写道:“我想从 p 中取出 N 个元素,其中 N 是 1 到 K 之间的随机数,并创建一个从 s 到 p 中的这 N 个元素的映射。”但是你说的是K = 3,而不是N = 3。您的第一个示例结果如何受到来自 p 的 3 个随机元素的约束,因为它包含 11 个不同的元素(
:a到:l)? -
@PiotrekBzdyl 我的意思是我选择一个从 1 到 K 的随机数,比如 K = 3 我得到 2。然后我从 p 中选择 2 个元素并从 s 中的第一个元素创建一个映射对这 2 个元素。然后我会将这些丢弃到 p 中的元素,并对 s 中的下一个元素执行相同的过程,依此类推
标签: clojure