【问题标题】:Random Number generation with probability in matlab [closed]在matlab中以概率生成随机数[关闭]
【发布时间】:2013-12-06 08:45:44
【问题描述】:

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

【问题讨论】:

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

标签: arrays matlab random probability


【解决方案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

【讨论】:

    【解决方案2】:

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

    首先设置任何字母的最大样本数;不必与 # of 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 2016-01-26
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2016-01-06
      相关资源
      最近更新 更多