对于数组中的每个元素,选择数组中的随机元素

时间:2014-05-03 01:14:36

标签: c algorithm random

我遇到了编程工作,我遇到了困难。 其描述如下:

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

实施例: 如果鲍勃,爱丽丝,约翰和乔治正在参加小孩,随机选择后 输出可能看起来像

   Kid            Secret Santa 

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

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

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

  1. 输入参与学生人数,然后将其存储在数组中。
  2. 然后形成另一个整数数组,大小等于参与的孩子数量。
  3. 随机播放整数数组。
  4. 然后遍历两个数组,找到匹配。
  5. 这是正确的方法吗?它会浪费整数数组的额外空间。 任何人都可以帮我找到更有效的解决方案(最小化空间利用率)。

1 个答案:

答案 0 :(得分:3)

您不需要两个阵列 - 您需要一个阵列。您要查找的正式名称是Random Permutation。有多种众所周知的算法 - 例如,Fisher–Yates shuffle

您的问题的算法如下:

  • 输入孩子的数量N
  • 制作一个N项目数组
  • 使用数字0到N-1填充
  • 运行Fisher-Yates shuffle
  • 检查没有自我指定(即位置i的排列成员未设置为i
  • 如果有自行分配,请再次运行Fisher-Yates洗牌,直到您获得无自我分配的结果
  • 使用生成的排列来确定哪个孩子是谁的秘密圣诞老人。

例如,如果N为4,则排列为1, 3, 0, 2,则分配如下:

0. Bob  ---------- Alice  .1
1. Alice --------- John   .3
2. George -------- Bob    .0
3. John ---------- George .2