Arrays matlab中随机数的概率生成

Arrays matlab中随机数的概率生成,arrays,matlab,random,probability,Arrays,Matlab,Random,Probability,我需要用字母“a,b,c,d”模拟一个信息源,其概率分别为0.1,0.5,0.2,0.2。我不知道如何用MATLAB做它。非常感谢您的帮助。您可以做如下简单的事情。只需使用rand创建一个大的随机向量,这将以统一的概率创建0到1之间的值。所以,如果你想让一个数字有10%的概率出现,你就给它一个0.1的范围,通常是0到0.1。然后,您可以将更多范围添加到这些相同的数字中,以获得所需的内容 vals =rand(1,10000); letters = cell(size(vals)); [lette

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

您可以做如下简单的事情。只需使用
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');
vals=rand(110000);
字母=单元格(大小(VAL));
[字母{vals 0.1和0.6和0.8和vals lowerBounds(i)和vals numElements
[~,idx]=min(mod(百分比*数值,1));
numEach(idx)=numEach(idx)-1;
结束
指数=randperm(单位);
输出=单元(大小(指数));
下限=[0,cumsum(numEach(1:end-1))]+1;
上限=总和(努美克);
对于i=1:numel(较低)
[输出{索引(下(i):上(i))}]=deal(letters2use{i});
结束
输出

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

首先设置任何字母的最大样本数;不必与兰德样本数相同(下文稍后):

定义问题的数据:

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

这个函数可能有用。你的概率总和为1。但你必须向我们展示你迄今为止所做的尝试。我应该有一个概率为0.5的数组,概率为b,概率为0.1..a,概率为0.2..c,概率为0.2 d。假设数组长度为100。我需要一个包含50个b,20个c,20个d,10个a的集合。但是字母顺序是随机混合的。@user3018734:现在您要求的是不同的东西,您不太可能完全匹配期望值。
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