配对列表中的随机项

时间:2018-03-02 00:18:54

标签: c# random

我正在尝试制作一个程序来随机化一个事件的条目。我的程序运行良好,可以输入条目,但我坚持随机化它。

我有2个名单,我们叫一个头,另一个叫脚跟。我的列表如下:

  • 负责人:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  • 脚跟:[1a, 2a, 3a, 4a, 5a, 6a, 7a, 8a, 9a, 10a]

我希望Head中的每个项目都有来自Heel的2个随机合作伙伴,但Heel的任何值都不能超过两次。在最终输出中,每个条目应该列出两次而且只列出两次。

希望有人理解并且能够帮助我,谢谢。

2 个答案:

答案 0 :(得分:1)

我觉得我需要长时间洗澡,我觉得让这段代码看得很清楚,但是OP的逻辑让我感到羞愧。无论如何,凌晨3点我觉得这应该有用:

var head = new List<char>("abcdef");
var heel = new List<char>("123456");
heel = heel.Concat(heel);

var randomer = new Random();

foreach (var knownItem in head)
{
    var idx1 = randomer.Next(heel.Count);
    var pair1 = heel[idx1];
    heel.RemoveAt(idx1);

    char pair2='\0';            
    while (true)
    {
       var idx2 = randomer.Next(heel.Count);
       pair2 = heel[idx2];
       if (pair2 != pair1)
       {
          heel.RemoveAt(idx2);
          break;
       }
    }

    //DoTheDew
}

明天的后续步骤:dieharder测试此版本与@Arj的结果

答案 1 :(得分:0)

这是一个可能的解决方案。由于没有代码可以开始,我现在已经用伪代码完成了。

  1. 创建两个列表,每个列表都包含heel中的所有值;称他们为heel1heel2
  2. 对于i中的每个元素head
    1. 生成j的随机数0 <= j < heel1.size。删除heel1[j]处的元素 - 这是您的第一个配对
    2. 重复heel2(针对不同的生成j)。在heel2[j]删除该元素 - 这是第二个配对
    3. i与两个已删除的值一起存储
  3. 最后,head中的每个值都有两个数字,脚跟的值不会超过两次。由于我们每次都删除任何使用过的值,因此我们不需要检查您的&#34;超过两个配对&#34;规则。