当前位置: 首页 > 知识库问答 >
问题:

为数组中的每个元素选择一个随机元素

东郭赞
2023-03-14

我被分配了一项编程任务,但我被卡住了。其说明如下:

有一个名为“秘密圣诞老人”(给他们礼物)的游戏,有很多孩子参加。对于每个参与的孩子,都有一个来自参与孩子的秘密圣诞朋友。我必须编写一个程序,为每个参与的孩子挑选一个秘密的圣诞老人朋友。

示例:如果Bob,Alice,John和George是参与的孩子,在随机选择之后,
输出可能看起来像

   Kid            Secret Santa 

   Bob ---------- John
   Alice--------- Bob
   George-------- Alice
   John---------- George

具有相同输入的连续两次程序运行不应有相同的结果。

我的想法是:(基于C的实现)

  1. 输入参与学生的人数,然后将其存储在数组中。
  2. 然后形成另一个整数数组,大小等于参与的孩子的数量。
  3. 洗牌整数数组。
  4. 然后遍历两个数组,找到匹配的数组。

这样做对吗?这将浪费整数数组的额外空间。谁能帮我找到一个更有效的解决方案(最大限度地减少空间利用率)。

共有1个答案

司寇高洁
2023-03-14

您不需要两个数组-您需要一个。你试图找到的东西的正式名称是随机排列。它有多种众所周知的算法——例如费希尔-耶茨洗牌。

您的问题的算法如下所示:

  • 输入孩子数,N
  • 创建一个N项的数组
  • 填上数字0到N-1,包括
  • 运行费舍尔-耶茨洗牌
  • 检查是否没有自赋值(即位置i的置换没有成员设置为i
  • 如果有自我分配,再次运行Fiser-Yates洗牌,直到你得到一个没有自我分配的结果
  • 使用生成的排列来决定哪个孩子是谁的秘密圣诞老人。

例如,如果N为四,则排列为1、3、0、2,则赋值如下:

0. Bob  ---------- Alice  .1
1. Alice --------- John   .3
2. George -------- Bob    .0
3. John ---------- George .2
 类似资料:
  • 问题内容: 假设我有一个数组,我想随机选择一个元素。 最简单的方法是什么? 明显的方法是。但是也许有红宝石之类的东西?或者如果不能通过扩展创建这种方法? 问题答案: Swift 4.2及更高版本 推荐的新方法是Collection协议的内置方法:。它返回一个可选参数以避免我以前假设的空情况。 如果不创建数组并且不能保证count> 0,则应执行以下操作: Swift 4.1及以下 只是为了回答您的

  • 假设我有一个数组,我想随机选择一个元素。 最简单的方法是什么? 最明显的方法是数组[随机索引]。但可能有类似ruby的数组。示例 ?或者,如果不是,那么可以使用扩展创建这样的方法吗?

  • 问题内容: 如何选择前5个随机元素 但它需要所有随机元素。我只想要第一个5。 还有另一种方法可以做同样的事情吗? 问题答案: 这是从jQuery选择中获取5个随机元素的方法,无需插件! 此时,您已经从jQuery返回的所有LI中随机选择了5个DomElement 然后,您可以对它们进行任何操作, 例如更改其颜色: 或显示其合并的文本内容:

  • 问题内容: 我正在寻找从整数数组中随机选择数字的解决方案。 例如我有一个数组,如何随机选择一个数字? 问题答案:

  • 问题内容: 如何从集合中选择随机元素?我对从Java中的HashSet或LinkedHashSet中选择随机元素特别感兴趣。也欢迎使用其他语言的解决方案。 问题答案:

  • 我知道有人问过类似的问题,比如 从包含n个元素的向量中随机选择m个元素 从未知长度的序列中随机选择N个项目 但我越看越困惑。 从N个元素中均匀随机地选择M个元素 所以我需要从N个元素中选择M个元素。我还需要使被选中的概率均匀分布于每个元素: 我的直觉是 随机选择一个元素 把它拿出来 对其余元素重复此过程 我猜这个解决方案错了?所选元素的概率为,<代码>1/(N-M),而不是,对吗? 一个可能的正确