方法1:
要从M个数字中随机取N个数,最直接的想法把已经取得的随机数存储起来,
每次随机取一个数,
在存储的随机数中如果能够找到,就要重新再取,
直到取到足够数量的随机数。
这个方法的好处是容易理解,容易实现。
但它的时间性能是O(N2),因为存在一个2重循环。如果样本较多,时间会急剧增加。
方法2:
在外层循环难以避免的情况下,把内层循环换成固定时间的算法。代码如下:
即:每次生成随机数后,会进行一次交换。使得已生成随机数的序号与未生成随机数的序号分离开来。
而序号与数值仍然保持一一对应。代码如下:
public static void getRandom(int[] buffer) {
final int n = buffer.length;
for(int ii = 0;ii < n;ii ++) {
buffer[ii] = ii;
}
Random random = new Random();
final int half = n/2;
for(int jj = 0;jj < half;jj ++) {
int pos = random.nextInt(n - jj) + jj;
int tmp = buffer[jj];
buffer[jj] = buffer[pos];
buffer[pos] = tmp;
}
}