洗牌整数数组以制作安全键盘

时间:2014-08-02 18:17:24

标签: c#

我创建了一个方法,用于将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数组随机化的最佳方法是什么。

3 个答案:

答案 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);
}