需要一个函数得到该数组,输入为n,k。
没有仔细考虑得到了一个油漆匠算法。
忍不住鄙视一下自己。这个函数真是超烂。本来很简单的一个事情竟然被我搞得那么复杂。程序员还是应该思而后动的。
没有仔细考虑得到了一个油漆匠算法。
private static int[] f(int n, int k) {
boolean[] bits = new boolean[n + 1];
Random r = new Random();
// k次循环,设置那些数出现在结果里。
for (int i = 0, stepRange = n + 1; i < k; i++, stepRange--) {
// 设置第几个为空的位。从0开始。
int step = r.nextInt(stepRange);
for (int j = 0;; j++) {
if (bits[j] == false && step == 0) {
bits[j] = true;
break;
} else if (bits[j] == false) {
step--;
}
}
}
int values[] = new int[k];
for (int i = 0, index = 0; i < bits.length; i++) {
if (bits[i]) {
values[index++] = i;
}
}
// 混乱函数
shuffle(values);
return values;
}
忍不住鄙视一下自己。这个函数真是超烂。本来很简单的一个事情竟然被我搞得那么复杂。程序员还是应该思而后动的。
int[] n_array = new int[n + 1];
for (int i = 0; i < n_array.length; i++) {
n_array[i] = i;
}
shuffle(n_array);
int[] k_array = new int[k];
System.arraycopy(n_array, 0, k_array, 0, k_array.length);