我们如何生成一定数量的随机数并将它们相互链接,而无需将数字链接到自身? [复制]
Posted
技术标签:
【中文标题】我们如何生成一定数量的随机数并将它们相互链接,而无需将数字链接到自身? [复制]【英文标题】:How can we generate some amount of random numbers and link them to each other without getting a number linked to itself? [duplicate] 【发布时间】:2020-08-18 21:00:02 【问题描述】:我正在编写一个程序,我需要对人员列表进行洗牌并将他们链接到列表中的另一个人。但问题在于奇数,因为可以将 1 个人与他们自己联系起来。 (我让这不可能,所以什么都没有发生。)
例如,如果有 3 个人分别称为“Bill”、“John”和“Jonas”。如果“Bill”得到“Jonas”而“Jonas”得到“Bill”,那么“John”将与“John”相关联,但我让这成为不可能(为了得到他们自己)所以什么都没有发生。
有谁知道我该如何解决这个问题?
【问题讨论】:
偶数人不也面临这个问题吗?另外,请显示您编写的导致此问题的代码。 也许你想使用 std::shuffle() en.cppreference.com/w/cpp/numeric/random 【参考方案1】:这本质上是一个“秘密圣诞老人”问题。有一个简单的算法:
-
随机排列人员名单。
对于每个人(最后一个人除外),将他们链接到列表中的下一个人。
将最后一个人链接到第一个人。
这保证是随机链接,并保证没有人链接到自己。
请注意,这并不是真正的随机,因为没有相互关联的子群体。从任何人开始,您都可以关注链接并联系其他所有人。如果我没记错的话,我认为在随机链接中有三分之一的时间会存在彼此无法访问的子组。但是,这种形式的改组和链接应该足以满足您的目的。
【讨论】:
这通常是足够的,但请注意它会降低一组可能性 - 例如。两个闭环。 @Bathsheba 是的,但从 OP 的描述来看,我怀疑他们需要那个。 在答案中可能值得一提,以防万一。例如。如果你有一个随机数生成器,它只生成某一类数字,那么你会觉得有必要指出它。 (不过很好的答案,+1)。 @cigien 我从来不知道你可以随机播放列表。这是一个简单的方法,谢谢。 @Bathsheba 好点,添加了警告。我是从很久以前读过的东西的模糊记忆中做的,所以如果我犯了错误,请随时编辑帖子。【参考方案2】:将人们按随机顺序排列,例如通过使用shuffle 然后将人 i 分配给人 i+1 并将最后一个分配给第一个。没有人会得到自己。
【讨论】:
以上是关于我们如何生成一定数量的随机数并将它们相互链接,而无需将数字链接到自身? [复制]的主要内容,如果未能解决你的问题,请参考以下文章