Algorithm 从有序列表创建随机有序列表

Algorithm 从有序列表创建随机有序列表,algorithm,Algorithm,我有一个应用程序,它获取制造过程的质量结果,并且 创建图形,既可以显示坏的帕累托图表,也可以显示生产吞吐量 为了自动化测试这些统计程序的任务,我希望能够确定地将记录添加到数据库中,并让质量技术转到某些图表,并与已知的良好图表进行比较。但是,我还想模拟结果,以便它们进入数据库,就像用户正在运行测试过程一样 我的一个想法是用I号good、j号bad1、k号bad2等填充一个列表,然后在插入数据库之前对列表进行随机排序 那么,我的问题是,有没有一个标准的算法来获取一个排序的值列表并创建一个随机排序的列

我有一个应用程序,它获取制造过程的质量结果,并且 创建图形,既可以显示坏的帕累托图表,也可以显示生产吞吐量

为了自动化测试这些统计程序的任务,我希望能够确定地将记录添加到数据库中,并让质量技术转到某些图表,并与已知的良好图表进行比较。但是,我还想模拟结果,以便它们进入数据库,就像用户正在运行测试过程一样

我的一个想法是用I号good、j号bad1、k号bad2等填充一个列表,然后在插入数据库之前对列表进行随机排序


那么,我的问题是,有没有一个标准的算法来获取一个排序的值列表并创建一个随机排序的列表

我们的主持人有一篇关于洗牌的非常好的文章,我相信可以采纳一些好的想法

我使用的方法是让循环运行多次,生成两个介于0和列表长度之间的随机数,然后交换这两个元素。

取决于“随机性”需要什么。最简单的方法可能只是将所有元素遍历到一个散列集中,然后迭代结果。您得到的顺序是确定的,但对于大多数意图和目的来说,可以认为是随机的。或者,您可以在列表的[0..length]之间生成随机数,挑出元素并将它们推到新列表上。假设列表删除是固定时间,结果将是以O(n)效率生成的随机列表。

random rnd=new random();
Random rnd = new Random();
List<int> orderedList = new List<int>();
List<int> randomList = new List<int>();
while (orderedList.Count != 0)
{
    int index = rnd.Next(0, orderedList.Count);
    randomList.Add(orderedList[index]);
    orderedList.RemoveAt(index);
}
List orderedList=新列表(); List randomList=新列表(); while(orderedList.Count!=0) { int index=rnd.Next(0,orderedList.Count); 添加(orderedList[index]); orderedList.RemoveAt(索引); }
您需要使用一个确保使用正确的洗牌算法,而不是一个自制的洗牌算法,因为它可能会给数据引入某种形式的微妙模式。请参见

一个简单的答案是让一个数组或向量循环一次,对于访问的每个位置,从列表的其余部分随机选择一个元素,并将其与当前元素交换。

为此,您需要一个合理的随机数生成器。

这是一篇糟糕的文章,它一开始是正确的,Fisher Yates/Knuth shuffle,然后尝试使用guid作为随机性源进行随机排序,结果出现了可怕的错误。不要浪费时间,只要阅读关于Fisher Yates的Wikipedia文章或使用正确实现洗牌的库即可。请注意,对于奇数大小的列表,这只会生成原始顺序的奇数排列,对于偶数大小的列表,这只会生成偶数排列。你通常不在乎,但如果你在乎,你可能会非常在乎。通过允许“与自身交换”来修复它。结果仍然是偏置输出,但是是满射的。好的,我明白了。因此,从列表的其余部分随机选取,或从列表本身随机选取,然后执行swap.doh!应该想到洗牌算法。谢谢。正确的方法是Fisher-Yates/Knuth shuffle。在维基百科上查看。