我知道如何在Matlab中生成一定范围内的随机数。我现在要做的是在一个范围内产生随机数,这个数字更有可能得到某些。
例如:我如何使用Matlab生成0到2之间的随机数,其中50%将小于0.5?
要获得0到2之间的数字,我会使用(2-0)* rand + 0。我怎么能这样做,但产生的数字的一定百分比小于0.5?有没有办法使用rand函数?
答案 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
,我们可以绘制:
所以我们可以看到这些值是如何在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
所以基本上它与我在这里发布的第一种方法相同,但它可能更准确和/或可读。另外,我没有测试哪种方法更快。