3

重複の可能性:
与えられた確率で乱数を生成する matlab

1、2、3 の数字をランダムに割り当てた列ベクトルを作成する必要があります。ただし、これら 3 つの数字のそれぞれの出現率を制御できる必要があります。

たとえば100 x 1列ベクトルがあり、ランダムな割り当てで、番号 1 の 30、番号 2 の 50、番号 3 の 20 が必要です。

4

2 に答える 2

4

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)))
于 2013-01-15T07:32:39.800 に答える
1

各数値のパーセンテージの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

于 2013-01-15T07:30:10.477 に答える