我创建了一个方法,用于将0到9之间的整数数组混洗,以便为我网站中的页面创建一个安全的键盘。我已经做到了:
int[] array = new int[10] {0,1,2,3,4,5,6,7,8,9};
List<int> numbs = new list<int>();
Random r = new Random();
for (int i = 0; i < array.Lenght;i++) {
Boolean b = true;
while (b){
if (i == r.Next(10)){
numbs.Add(array[i]);
b = false;
}
}
}
我知道这段代码的性能很差,因为Random必须一次又一次地生成一个随机数,我不知道应该运行多少次来生成一个等于i的值。所以,我想知道将int数组随机化的最佳方法是什么。
答案 0 :(得分:2)
使用良好分布来改组数据的一种更有效的方法是Fisher-Yates algorithm。
答案 1 :(得分:0)
你可以使用Linq:
Random rn = new Random();
List<int> srcNumbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> endNumbers = srcNumbers.OrderBy(x => rn.NextDouble()).ToList();
对于1000000个数字,linq / lambda方法需要393毫秒才能在i7 4770k CPU上随机排序。使用OP的原始方法大约30秒后,我只有4300个元素。
答案 2 :(得分:0)
而不是强制数组中的数字,如何从原始数组中选择一个随机元素,将其添加到新数组然后将其删除?有点像(抱歉伪代码,我不会说C#):
int[] orig = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] copy = {};
for (int i = 0; i < 10; i++) {
int index = random(orig.size);
copy.push(orig[index]);
orig.removeAt(index);
}