随机数生成matlab中的概率

时间:2013-11-21 17:57:19

标签: arrays matlab random probability

我需要模拟一个字母“a,b,c,d”的信息源,其概率分别为0.1,0.5,0.2,0.2。我不知道如何使用MATLAB做到这一点。非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

你可以做一些简单如下的事情。只需使用rand创建一个大的随机向量,这将创建0到1之间的值,并具有统一的概率。因此,如果你想要一个数字有10%的可能性出现,你给它一个0.1的范围,通常是0到0.1。然后,您可以为这些相同的数字添加更多范围,以获得您想要的内容。

vals =rand(1,10000);
letters = cell(size(vals));
[letters{vals<0.1}] = deal ('a');
[letters{vals > 0.1 & vals <= 0.6}] = deal ('b');
[letters{vals > 0.6 & vals <= 0.8}] = deal ('c');
[letters{vals > 0.8 & vals <= 1}] = deal ('d');

上面的代码将返回一个10000字符的字母数组,其中包含所描述的百分比。

或者您可以按如下方式动态执行此操作:

vals =rand(1,10000);
output= cell(size(vals));
letters2use = {'a','b','c','d'};
percentages = [0.1,0.5,0.2,0.2];
lowerBounds = [0,cumsum(percentages(1:end-1))];
upperBounds = cumsum(percentages);
for i = 1:numel(percentages)
    [output{vals > lowerBounds(i) & vals <= upperBounds(i)}] = deal(letters2use{i}) ;
end

<强>更新

上述代码无法保证每个字母出现一定数量,但以下情况如下。从您的评论开始,您似乎需要通过随机分配字母来完成以下代码中的每一个的确切数量

numElements = 10000;
letters2use = {'a','b','c','d'};
percentages = [0.1,0.5,0.2,0.2];
numEach = round(percentages*numElements);
while sum(numEach) < numElements
   [~,idx] = max(mod(percentages*numElements,1));
   numEach(idx) = numEach(idx) + 1;
end
while sum(numEach) > numElements
   [~,idx] = min(mod(percentages*numElements,1));
   numEach(idx) = numEach(idx) - 1;
end
indices = randperm(numElements);
output = cell(size(indices));
lower = [0,cumsum(numEach(1:end-1))]+1;
upper = cumsum(numEach);
for i = 1:numel(lower)
    [output{indices(lower(i):upper(i))}] = deal(letters2use{i});
end
output

答案 1 :(得分:1)

您可以先创建一个数组,其中包含由相对概率定义的每个字符的相对数字。

首先设置任何字母的最大样本数量;不必与rand样本的数量相同(稍后在下面):

maxSamplesEach = 100; 

定义问题的数据:

strings = ['a' 'b' 'c' 'd'];
probabilty = [0.1 0.5 0.2 0.2];

构造一个由相对概率加权的样本空间:

count = 0;
for k = 1:size(strings,2)
    for i = 1:probabilty(k)*maxSamplesEach
        count = count+1;
        totalSampleSpace(count) = strings(k);
    end 
end

现在定义随机数的范围:

min = 1; 
max = count;

现在从上面定义的范围内的均匀分布生成100个随机数:

N = 100;
randomSelections = round(min + (max-min).*rand(1,N));

现在,您可以从分发中随机抽取样本:

randomSamples = totalSampleSpace(randomSelections);

接下来只计算一下:

for k = 1:size(strings,2)
    indices = [];
    indices = find(randomSamples == strings(k));
    disp(['Count samples for ', strings(k),' = ', num2str(size(indices,2))]);
end

请记住,这些结果本质上是统计性的,因此您每次都不太可能获得相同的相对贡献。

示例输出:

Count samples for a = 11
Count samples for b = 49
Count samples for c = 19
Count samples for d = 21