【问题标题】:Pairing random items in lists [closed]配对列表中的随机项目[关闭]
【发布时间】:2018-03-02 00:18:53
【问题描述】:

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

我有 2 个列表,我们称一个 Head 和另一个 Heel。我的清单如下:

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

我希望 Head 中的每个项目都有 2 个来自 Heel 的随机伙伴,但在这一切结束时,Heel 的任何值都不能匹配超过两次。在最终输出中,每个条目应列出两次且仅列出两次。

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

【问题讨论】:

  • 最好在您尝试过的地方显示代码并询问有关它的特定问题...
  • 这里没有问题。你想要的东西清单不是问题。您有什么有答案的具体问题?
  • 一旦您了解了 OP 想要达到的目标,我认为这并不算太糟糕,只是措辞不好!

标签: c# random


【解决方案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
}

明天的下一步:更加顽固地测试这个版本与@Arj的结果

【讨论】:

    【解决方案2】:

    这是一个可能的解决方案。由于没有代码开始,我暂时用伪代码完成。

    1. 创建两个列表,每个列表都包含heel 中的所有值;打电话给他们heel1heel2
    2. 对于head 中的每个元素i
      1. 生成一个随机数j,其中0 &lt;= j &lt; heel1.size。删除 heel1[j] 处的元素 - 这是您的第一次配对
      2. 使用heel2 重复(生成不同的j)。删除 heel2[j] 处的那个元素 - 这是第二个配对
      3. i 与两个已删除的值一起存储

    到最后,head 中的每个值都会有两个数字,并且没有来自后跟的值出现超过两次。由于我们每次都会删除任何已使用的值,因此我们不需要检查您的“超过两个配对”规则。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多