有一次需要生成N序列的不重复数字,最直观的理解就是不断生成一个小于N的随机数S,然后放入一个int[N]中:
1.当S不存在于int[N]中时,将S添加到int[N]中。
2.否则,重新生成S。
Random random = new Random(); int[] mat = new int[num]; mat[0] = random.Next(0, num); int index = 2; while (index < num) { bool find = false; int tmp = random.Next(0, num); for (int i = 0; i < index; i++) { if (tmp == mat[i]) { break; } if (i == index - 1) { find = true; } } if (find) { mat[index] = tmp; index++; } }
这样的效率是极其低下的,当时怎么也不知道怎么想的就这么写了。后来觉得还是上网查找一下,得到一个更好的方法。
生成一个N序列的数组int[N],生成一个随机位置P,将int[p]与int[i]对调。不断缩小i的范围直至0。这个数组内的值就被“打乱”了。
Random random = new Random(); int[] mat = new int[num]; int i, p=0, tmp=0; for(i=0;i<num;i++) mat[i] = i; for (i = num-1; i >= 0;i-- ) { p = random.Next(0, i); tmp = mat[p]; mat[p] = mat[i]; mat[i] = tmp; }