ランダムな添え字

アルゴリズム
スポンサーリンク

こんな感じで。

Java

	/**
	 * 指定した長さの一様分布な重複しないランダムな添え字を作成します。
	 * @param length
	 * @param seed
	 * @return
	 */
	public static int[] getRandomIndex(int length, long seed) {
		Random random = new Random(seed);
		int[] buffer = new int[length];
		for (int i = 0; i < length; i++) {
			buffer[i] = i;
		}
		int[] out = new int[length];
		int n, rest;
		for (int i = 0; i < length; i++) {
			rest = length – i;
			n = (random.nextInt() & 0x7FFFFFFF) % rest;
			out[i] = buffer[n];
			if (1 != rest – n) {
				for (int j = 1; j < rest – n; j++) {
					buffer[n + j - 1] = buffer[n + j];
				}
			}
		}
		return (out);
	}

MATLAB

function [ out ] = getRandomIndex( length, seed )
%[ out ] = getRandomIndex( length, seed )
%指定した長さの一様分布な重複しないランダムな添え字を作成します。

if nargin==2
	s = RandStream.create('mt19937ar','seed',seed);
	RandStream.setDefaultStream(s);
end

data = 1:1:length;
out  = zeros(1,length);
rest = length;

%重複しないランダムな値を作成
for j=1:length
	n = 1 + fix(rest * rand(1,1));
	out(j) = data(n);
	if 0~=rest-n
		for k=1:rest-n
			data(n+k-1) = data(n+k);
		end
	end
	rest = rest – 1;
end

コメント

タイトルとURLをコピーしました