在一个范围内生成随机整数并在Matlab中排除特定整数的最佳方法是什么?

时间:2012-08-29 02:04:00

标签: matlab random

我目前有以下功能,但有没有更有效的方法在一个范围内生成一个随机整数并在Matlab中排除一个特定的整数?

function aNew = random(a)
aMin = a-100;
aMax = a+100;
aNew = a;
while aNew == a
    aNew = randi([aMin, aMax]);
end

4 个答案:

答案 0 :(得分:1)

您可以使用函数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

答案 1 :(得分:1)

您当前的方法会进行拒绝抽样。为什么不这样做:假设您要从中抽取样本的整数范围是[a, c],而您要排除的数字是b。然后从[a, c-1]进行采样,对于大于或等于b的每个样本,将其递增1。

答案 2 :(得分: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

答案 3 :(得分:0)

根据@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