生成特定范围内的随机数

时间:2012-01-24 18:29:31

标签: matlab random statistics

我想在MATLAB中为长程序生成高斯随机数,该程序运行多次迭代。我使用了randn函数,但有一种方法可以避免负面结果并生成1到100范围内的随机数。

例如

X = 0.02 * randn;

如何才能获得特定范围内的正值。

3 个答案:

答案 0 :(得分:4)

正如Cheery所写的那样,高斯分布涵盖了整个真实集合,因此无法使数字正常分布且支持有限。

解决方案可能是截断值:当randn返回超出所需范围的值时,重新生成值。

这可以通过以下代码非常容易(并且天真地)实现:

function x = randnlimit(mu, sigma, minVal, maxVal, varargin);

assert(mu>=minVal && mu<=maxVal);
assert(sigma>0);

x = mu + sigma*randn(varargin{:});
outsideRange = x<minVal | x>maxVal;
while nnz(outsideRange)>0
   x(outsideRange) = mu + sigma*randn(nnz(outsideRange),1);
   outsideRange = x<minVal | x>maxVal;
end

编辑总结讨论@Cheery,我有: 你可以选择:你得到一个高斯,但是你会遇到覆盖整个实轴的值(所以也是负值)。另一方面,如果您需要有限的范围,则需要使用不同的分布来生成样本。

您需要哪种方法取决于您的应用程序。是否需要有限的支持是最原始的,或者pdf的形状是最重要的。

当您恰当选择[minVal, maxVal]sigma时,我上面提供的代码将限制在范围mu和高斯范围内,即mu = maxVal/2 + minVal/2n * sigma = maxVal - minVal 。对于大于2的n的值,分布将非常接近真实的高斯分布。例如。对于n=2,我预计只有5%的差异(n=3,不到1%)。您当然可以指定minVal = 0maxVal = +Inf来仅选择正值。

答案 1 :(得分:0)

根据定义,高斯分布具有(-inf,inf)的分布。标准差(sigma)默认为1。如果你正在寻找均匀分布[1,100] 使用99 * rand()+ 1或randi([1 100])作为整数。

ps:对于具有范围的高斯分布,有一个解决方案(通过设置sigma和移动最大分布) http://www.mathworks.com/matlabcentral/newsreader/view_thread/156521

function X=random_generator(n, x_max, x_min)
    X=[x_min+((randn(n,n)).*(x_max-x_min))];
end

x_min这里不是最小值 - 它是平均值(或分布的峰值)。分布相对于x_min是对称的。但是,在整个X轴上定义的分布不会消除负值。他们的概率会更小。

pps:来自Matlab的手册

  

使用均值1和标准从正态分布生成值   偏差2:1 + 2. * randn(100,1);

答案 2 :(得分:0)

您必须选择具有所需属性的有限支持分布,请检查http://en.wikipedia.org/wiki/List_of_probability_distributions。我有一个类似的问题,我想将有限混合模型应用于有限的支持分布,不幸的是,大多数算法都集中在高斯分布上。