我有每个长度为m
的n
列表。假设n*m
为偶数。我希望得到一个包含所有元素的随机混洗列表,约束条件是locations i,i+1
i=0,2,...,n*m-2
中的元素永远不会来自同一个列表。编辑:除了这个限制之外,我不想偏向随机列表的分布。也就是说,解决方案应该等同于一个完全随机的选择,它被重新洗牌,直到约束成立。
示例:
list1: a1,a2
list2: b1,b2
list3: c1,c2
允许: b1、c1、c2、a2、a1、b2
不允许: b1、c1、c2、b2、a1、a2
发布于 2019-01-04 15:38:18
一种可能的解决方案是将你的数字集想象成n个项目块,每个项目块的长度为m。如果你从每个列表中为每个项目随机选择一个项目,那么你永远不会遇到死胡同。只需确保每个块中的第一项(第一个块除外)的列表与前一个块的最后一个元素不同即可。
您还可以迭代地随机化数字,始终确保从与前一个数字不同的列表中进行选择,但这样可能会遇到一些死胡同。
最后,另一个可能的解决方案是按顺序对每个位置上的数字进行随机化,但只从那些“可以放在那里”的位置上进行随机化,也就是说,如果你放一个数字,就不会违反任何约束,也就是说,你至少会有一个可能的解决方案。
发布于 2019-01-08 09:40:31
上面b的一个变种,避免了死胡同:在每一步,你选择两次。首先,随机选择一个项目。第二,随机选择放置位置。在第k个步骤中,有k个可选位置来放置项(新项可以插入到两个现有项之间)。当然,您只能从允许的位置中进行选择。钱!
发布于 2019-01-08 10:17:17
重要-如何避免死锁?
如果所有剩余项仅来自一个组,则可能发生死锁。
要避免这种情况,请在每次迭代中检查所有列表的长度
以及检查最长列表是否长于所有其他的总和。
如果为true,则为拉取该列表的
这样你就不会只剩下一个完整的列表了
以下是在python https://gist.github.com/YontiLevin/bd32815a0ec62b920bed214921a96c9d中尝试解决此问题的要点
https://stackoverflow.com/questions/54041705
复制相似问题