c++ - 我们如何生成一定数量的随机数并将它们相互链接,而无需将数字链接到自身?
问题描述
我正在编写一个程序,我需要对人员列表进行洗牌并将他们链接到列表中的另一个人。但问题在于奇数,因为可以将 1 个人与他们自己联系起来。(我让这不可能,所以什么也没有发生。)
例如,如果有 3 个人分别称为“Bill”、“John”和“Jonas”。如果'Bill' 得到'Jonas' 而'Jonas' 得到'Bill',那么'John' 与'John' 相关联,但我使这成为不可能(为了得到他们自己)所以什么都没有发生。
有谁知道我该如何解决这个问题?
解决方案
这本质上是一个“秘密圣诞老人”问题。有一个简单的算法:
- 随机洗牌人员名单。
- 对于每个人(最后一个人除外),将他们链接到列表中的下一个人。
- 将最后一个人与第一个人联系起来。
这保证是随机链接,并保证没有人链接到他们自己。
请注意,这并不是真正随机的,因为没有相互关联的子群体。从任何人开始,您都可以关注链接并联系其他所有人。如果我没记错的话,我认为在随机链接中有三分之一的时间会存在彼此无法访问的子组。但是,这种形式的改组和链接应该足以满足您的目的。
推荐阅读
- java - Java Deprecated APIs 和 SuppressWarnings “deprecation” - 实用方法
- python - 如何在打印语句中开始新行
- spring-boot - 使用spring boot为rest webservices设计多个json对象响应
- android - SmartGLView 后面的 NavigationDrawer
- regex - C# 正则表达式模式匹配关键字
- node.js - 数据显示在 websocket 响应中,但未显示在已解决的承诺中
- android - llvm-rs-cc 缺少颤振
- sql-server - 未显示 SQL Server Management Studio (V17.7) 功能工具提示
- sublimetext3 - 如果侧边栏打开,如何检测键绑定?
- android - 检查 json 对象是否包含特定值