论坛首页 综合技术论坛

生成不大于n的k个两两不同的自然数

浏览 1343 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-20   最后修改:2010-08-02
需要一个函数得到该数组,输入为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);

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics