从有序列表中创建随机有序列表
我有一个应用程序,该应用程序可以获取制造过程的质量结果,
创建图形既可以显示不良的帕累托图,也可以显示生产量。
为了使测试这些统计程序的任务自动化,我希望能够确定地将记录添加到数据库中,并使质量技术能够访问某些图表并与已知的良好图表进行比较。但是,我也想模拟结果,以便它们像进入用户整个测试过程一样进入数据库。
我有一个想法是用i好的数字,j的坏数字1,k的坏数字2等填充一个列表,然后以某种方式随机排序列表,然后再插入数据库。
因此,我的问题是,有没有一种标准算法来获取值的排序列表并创建随机排序的列表?
解决方案
我们的主持人有一篇关于洗牌的很好的文章,我相信可以采用一些好主意
http://www.codinghorror.com/blog/archives/001008.html
我以前这样做的方式是让循环运行多次,该循环将生成介于0和列表长度之间的两个随机数,然后交换这两个元素。
取决于我们对"随机性"的需求。最简单的方法可能就是将所有元素都放入一个哈希集并遍历结果。我们获得的顺序将是确定性的,但对于大多数意图和目的,可以认为是随机的。或者,我们可以在列表的[0..length]之间生成随机数,挑选元素并将其推入新列表。假设列表删除是固定时间,则结果将是效率为O(n)的随机列表。
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); }
我们将要使用随机播放算法。确保使用适当的混洗算法而不是自制算法,因为它可能会给数据引入某种形式的微妙模式。请参阅Jeff Atwood的有关使用"足够随机"随机播放的问题的文章。
一个简单的答案是拥有一个数组或者向量,循环遍历一次,对于访问的每个位置,从列表的其余部分中随机选择一个元素,并将其与当前元素交换。
为此,我们需要一个合理的随机数生成器。
有一些现成的实现可用,例如http://msdn.microsoft.com/en-us/library/bb385047.aspx和http://java.sun.com/javase/6/docs/api/java/util/Collections .html#shuffle(java.util.List)