現在、次の関数がありますが、範囲内でランダムな整数を生成し、Matlabで特定の整数を除外するより効率的な方法はありますか?
function aNew = random(a)
aMin = a-100;
aMax = a+100;
aNew = a;
while aNew == a
aNew = randi([aMin, aMax]);
end
この関数randsample
を使用して、指定した分布からサンプルを描画できます。
このようなものはうまくいくはずです
sampleRange = [1, 100]; % sample from 1 to 100
noSample = 50; % lets exclude 50
pop2Sample = [range(1):noSample-1, noSample+1:range(2)]; %create the population
sample = randsample(pop2Sample,1); %draw a single sample
アップデート
母集団から複数の値を除外したい場合は、このsetdiff
関数を使用できます。
pop2Sample = 1:100; % sample from 1 to 100
noSample = 0:10:100 % lets exclude any all multiples of ten
pop2Sample = setdiff(pop2Sample, noSample);
sample = randsample(pop2Sample,1); %draw a single sample
現在の方法では、棄却サンプリングが行われます。これを実行しないのはなぜですか。サンプルを抽出する整数の範囲がで[a, c]
あり、除外する数がであるとしますb
。次に、からサンプリングし[a, c-1]
、以上のすべてのサンプルについてb
、1ずつインクリメントします。
このようなことをしてみませんか:
function aNew = random(a, sz)
if nargin == 1, sz = [1 1]; end
aMin = a-100;
aMax = a+100;
aNew = randi([aMin aMax-1], sz);
aNew(aNew == a) = aMax;
end
@slaytonのソリューションに沿って、N
サンプルを均一にサンプリングするために、置換を使用して、値の母集団内でランダムにインデックスを作成できます。
N = 10; % samples
aMin = -100; % lower
aMax = +100; % upper
a = 0; % excluded int
valPop = [aMin:a-1, a+1:aMax]; % value population
samples = valPop(randi([1, N-1], 1, N)); % with resampling