我正在尝试制作一个程序来随机化一个事件的条目。我的程序运行良好,可以输入条目,但我坚持随机化它。
我有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的任何值都不能超过两次。在最终输出中,每个条目应列出两次,仅列出两次。
希望有人理解并能够帮助我,谢谢。
我觉得我需要长时间洗澡,我觉得让这段代码看得很清楚,但是有些关于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的结果
这是一个可能的解决方案。由于没有代码可以开始,我现在已经在伪代码中完成了它。
heel
中的所有值;称他们为heel1
和heel2
i
中的每个元素head
:
生成随机数j
0 <= j < heel1.size
。删除heel1[j]
上的元素 - 这是你的第一个配对
重复heel2
(对于不同的生成j
)。在heel2[j]
删除该元素 - 这是第二个配对
存储i
以及两个删除的值到最后,你将在head
中为每个值设置两个数字,而脚跟的值不会超过两次。由于我们每次都删除任何使用过的值,因此我们不需要检查您的“两个以上配对”规则。