对整数数组进行洗牌,以获得安全的键盘
本文关键字:安全 键盘 数组 整数 | 更新日期: 2023-09-27 18:16:01
我创建了一个方法,该方法将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数组的最佳方法是什么
对于具有良好分布的数据进行洗牌比较有效的方法之一是Fisher-Yates算法。
与其对数组中的数字进行暴力处理,不如从原始数组中选择一个随机元素,将其添加到新数组中,然后将其删除?类似于(抱歉伪代码,我不会说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);
}
你可以使用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方法在i7 4770k的CPU上随机排序需要393毫秒。使用OP的原始方法大约30秒后,我只有4300个元素。