重複の可能性:
与えられた確率で乱数を生成する matlab
1、2、3 の数字をランダムに割り当てた列ベクトルを作成する必要があります。ただし、これら 3 つの数字のそれぞれの出現率を制御できる必要があります。
たとえば、100 x 1
列ベクトルがあり、ランダムな割り当てで、番号 1 の 30、番号 2 の 50、番号 3 の 20 が必要です。
重複の可能性:
与えられた確率で乱数を生成する matlab
1、2、3 の数字をランダムに割り当てた列ベクトルを作成する必要があります。ただし、これら 3 つの数字のそれぞれの出現率を制御できる必要があります。
たとえば、100 x 1
列ベクトルがあり、ランダムな割り当てで、番号 1 の 30、番号 2 の 50、番号 3 の 20 が必要です。
rand
またはrandi
関数でそれを実行できるかどうかはわかりません。
次のような小さなモジュールを書くことができるかもしれません:
bit1 = 1 * ones(1,20);
bit2 = 2 * ones(1,50);
bit3 = 3 * ones(1,30);
bits = [bit1 bit2 bit3];
randbits = bits(:, randperm(length(bits)))
各数値のパーセンテージのCDF (累積分布関数)を使用してそれを行うことができます。
pdf = [ 30 50 20 ]/100; % the prob. distribution fun. of the samples
cdf = cumsum( pdf );
% I assume here all entries of the PDF are positive and sum(pdf)==1
% If this is not the case, you may normalize pdf to sum to 1.
サンプリング自体
n = 100; % number of samples required
v = rand(n,1); % uniformly samples
tmp = bsxfun( @le, v, cdf );
[~, r] = max( tmp, [], 2 );
@Dan が観察したように (以下のコメントを参照)、最後の行は次のように置き換えることができます
r = numel(pdf) + 1 - sum( tmp, 2 );
ベクトルr
は整数のランダム ベクトルであり1,2,3
、目的の条件を満たす必要があります。pdf