Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何从给定概率的数组中提取数字_Matlab - Fatal编程技术网

Matlab 如何从给定概率的数组中提取数字

Matlab 如何从给定概率的数组中提取数字,matlab,Matlab,我有两个概率分别为7和3的数字1,2。如何根据给定的概率选择一个数字 直接实施 你需要的是一个比例伯努利随机数发生器。原始的伯努利随机变量是0或1,需要1或2。因此,以下代码应该可以工作: a = binornd(1,0.3)+1; 第一个参数是维度(这里是1,参见MATLAB文档),第二个参数是得到1的概率。通过加1,这成为获得2的概率 警告:不幽默的人不推荐回答其余部分。 极客实施 您可以使用统一随机生成器并对其进行调整: a = rand; %in (0,1) range result

我有两个概率分别为7和3的数字1,2。如何根据给定的概率选择一个数字

直接实施

你需要的是一个比例伯努利随机数发生器。原始的伯努利随机变量是0或1,需要1或2。因此,以下代码应该可以工作:

a = binornd(1,0.3)+1;
第一个参数是维度(这里是1,参见MATLAB文档),第二个参数是得到1的概率。通过加1,这成为获得2的概率

警告:不幽默的人不推荐回答其余部分。

极客实施

您可以使用统一随机生成器并对其进行调整:

a = rand; %in (0,1) range
result = 1*(a<=0.7) + 2*(a>0.7);
Über极客实施

假设
tic…toc
中小数部分的某个数字均匀随机:

tic
A = rand(12060, 4400);
B = rand(12000, 4430);
t=toc;
t=round(t*10^3);
t = mod(t, 10);
randVal = (t<=6)*1 + (t>6)*2;
tic
A=兰特(120604400);
B=兰特(120004430);
t=总有机碳;
t=圆形(t*10^3);
t=mod(t,10);
randVal=(t6)*2;
扩展的Über极客实施

扩展了前面的方法,但这次使用伪随机生成的32位数字(每个位都像前面的方法一样生成),将其除以最大值,从而获得0和1之间近似均匀分布的变量

randNum = 0;
for i=0:31
   tic
   A = rand(12000, 4400);
   B = rand(12000, 4400);
   t=toc;
   t=round(t*10^3);
   randNum = randNum + mod(t,2)*2^i;
end
%randNum is a uniformly distributed number between 0 and 2^32 - 1

randNum = randNum/(2^32);

final = (randNum<=0.7)*1 + (randNum>0.7)*2;
randNum=0;
对于i=0:31
抽搐
A=兰特(120004400);
B=兰特(120004400);
t=总有机碳;
t=圆形(t*10^3);
randNum=randNum+mod(t,2)*2^i;
终止
%randNum是一个均匀分布的数字,介于0和2^32-1之间
randNum=randNum/(2^32);
最终=(randNum0.7)*2;

根据特定分布选择一个数字的基本问题非常常见。您的示例非常简单,尽管您的问题标题暗示您对通用解决方案感兴趣

下面是一个简单的函数,它通过选择0到1之间的随机数来工作。然后它循环遍历分布数组中的值,将它们从分布的cdf中累加到。一旦累加器中的值超过随机值,则返回索引

function idx = randWithDist(dist)
    r = rand;
    a = 0;
    idx = 0;
    while(r > a)
        idx = idx + 1;
        a = a + dist(idx);
    end
end
对于您的2值示例来说,这有些过分,但您可以这样使用:
randWithDist([7.3])

如果使用此选项从任意数组中选择值(如主题所示),只需使用返回值作为数组的索引:

dist = [.2 .3 .4 .1];
val = [1 2 10 11];

samples = [];
for i=1:10000
    samples = [samples val(randWithDist(dist))];
end

histogram(samples);
这应该选择概率为.2的1,概率为.3的2,概率为.4的10,概率为.1的11。柱状图显示它似乎工作正常


为了让它能够处理更一般的输入,我对它做的另一个调整是将第一行更改为
r=rand*sum(dist)
。这会自动规范化分布,因此不必求和为1。

到目前为止,您都尝试过什么?你有什么特别的问题吗?此外,你应该在维基百科上查找“伯努利分布”,这应该会对你有所帮助。。我如何使用伯努利过程来获取一个数字……纯天然的惊人+1.我通常不会对糟糕问题的答案投赞成票,但这一个我不能通过,干得好。@runDOSrun-我通常也不会,但如果答案真的很好,如果写答案的人付出了很多努力,也澄清了问题中一些令人困惑的部分,他们肯定会得到我的赞成票。可能更快(更干净):
result=1+(rand>0.7)您可能已经注意到效率不是主要标准,但清洁度肯定是:)我会将其纳入答案中。
dist = [.2 .3 .4 .1];
val = [1 2 10 11];

samples = [];
for i=1:10000
    samples = [samples val(randWithDist(dist))];
end

histogram(samples);