Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用对上的约束进行洗牌

使用对上的约束进行洗牌
EN

Stack Overflow用户
提问于 2019-01-04 15:20:05
回答 4查看 203关注 0票数 2

我有每个长度为mn列表。假设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

EN

回答 4

Stack Overflow用户

发布于 2019-01-04 15:38:18

一种可能的解决方案是将你的数字集想象成n个项目块,每个项目块的长度为m。如果你从每个列表中为每个项目随机选择一个项目,那么你永远不会遇到死胡同。只需确保每个块中的第一项(第一个块除外)的列表与前一个块的最后一个元素不同即可。

您还可以迭代地随机化数字,始终确保从与前一个数字不同的列表中进行选择,但这样可能会遇到一些死胡同。

最后,另一个可能的解决方案是按顺序对每个位置上的数字进行随机化,但只从那些“可以放在那里”的位置上进行随机化,也就是说,如果你放一个数字,就不会违反任何约束,也就是说,你至少会有一个可能的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2019-01-08 09:40:31

上面b的一个变种,避免了死胡同:在每一步,你选择两次。首先,随机选择一个项目。第二,随机选择放置位置。在第k个步骤中,有k个可选位置来放置项(新项可以插入到两个现有项之间)。当然,您只能从允许的位置中进行选择。钱!

票数 1
EN

Stack Overflow用户

发布于 2019-01-08 10:17:17

  1. 将列表排列到列表列表中
  2. 将列表中的每个项目与列表列表中的列表索引一起保存为元组
  3. 循环n*m次
  4. on even turns -展平为一个列表并仅弹出-产生项目和项目组
  5. 在奇数转折时-临时删除最后一个项目组并像以前一样弹出-最后将删除的组添加回来

重要-如何避免死锁?

如果所有剩余项仅来自一个组,则可能发生死锁。

要避免这种情况,请在每次迭代中检查所有列表的长度

以及检查最长列表是否长于所有其他的总和。

如果为true,则为拉取该列表的

这样你就不会只剩下一个完整的列表了

以下是在python https://gist.github.com/YontiLevin/bd32815a0ec62b920bed214921a96c9d中尝试解决此问题的要点

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54041705

复制
相关文章

相似问题

Python -使用约束对列表进行洗牌

10

带约束的numpy洗牌

20

如何实现序列的约束洗牌

20

洗牌与NRooks约束保存

15

具有重复约束的洗牌包

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文