在Matlab中生成带加权分布的随机数?

时间:2016-10-27 21:59:29

标签: matlab random octave

我知道如何在Matlab中生成一定范围内的随机数。我现在要做的是在一个范围内产生随机数,这个数字更有可能得到某些。

例如:我如何使用Matlab生成0到2之间的随机数,其中50%将小于0.5?

要获得0到2之间的数字,我会使用(2-0)* rand + 0。我怎么能这样做,但产生的数字的一定百分比小于0.5?有没有办法使用rand函数?

2 个答案:

答案 0 :(得分:1)

这是一个建议:

<button id="" ng-click="outputFolder()">Output Folder</button>

$scope.outputFolder= function () {
        var path = "\\mcsfvwdgemas01\AE";

    };          

我们有N = 10; % how many random numbers to generate bounds = [0 0.5 1 2]; % define the ranges prob = cumsum([0.5 0.3 0.2]); % define the probabilities % pick a random range with probability from 'prob': s = size(bounds,2)-cumsum(bsxfun(@lt,rand(N,1),prob),2); % pick a random number in this range: b = rand(1,N).*(bounds(s(:,end)+1)-bounds(s(:,end)))+bounds(s(:,end)) 概率在prob(k)bounds(k)之间绘制一个数字。基本上我们首先绘制具有定义概率的范围,然后从范围中绘制另一个数字。所以我们只对bounds(k+1)感兴趣,但在途中需要b(主要用于以矢量化方式创建大量数字)。

所以我们得到:

s

或者,对于b = Columns 1 through 5 0.5297 0.15791 0.88636 0.34822 0.062666 Columns 6 through 10 0.065076 0.54618 0.0039101 0.21155 0.82779 ,我们可以绘制:

hist

所以我们可以看到这些值是如何在N = 100000中的3个范围之间分配的。

答案 1 :(得分:0)

您可以使用多项分布绘制范围,然后计算随机数。方法如下:

N = 10;
bounds = [0 0.5 1 2]; % define the ranges
d = diff(bounds);
% pick a N random ranges from a multinomial distribution:
s = mnrnd(N,[0.5 0.3 0.2]);
% pick a random number in this range:
b = rand(1,N).*repelem(d,s)+repelem(bounds(1:end-1),s)

所以你得到s

s =
    50    39    11

表示你从第一个范围获取50个值,从第二个范围获取39个,依此类推......

你得到的结果是b

b =
  Columns 1 through 5
      0.28212     0.074551      0.18166     0.035787      0.33316
  Columns 6 through 10
      0.12404     0.93468       1.9808      1.4522        1.6955

所以基本上它与我在这里发布的第一种方法相同,但它可能更准确和/或可读。另外,我没有测试哪种方法更快。