こんな感じで。
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
0
コメント