任何特定值的概率为零(嗯,实际上大约是 2^64 中的 1 部分...这是有多少不同的浮点数,因为它们由 64 位二进制表示; 而且它们的可能性不相等,因此答案比这更复杂)。
一个更好的问题是“概率是多少密度”——可以描述为的极限
P(x - dx < X < x + dx)
----------------------
2 * dx
这实际上是您的“概率密度函数”或 PDF 的定义。在您的情况下,您使用的是具有平均 mu 和标准偏差 sigma 的正态分布,然后
pdf(X) = exp(-(X-mu)*(X-mu) / (2 * sigma * sigma)) / (sqrt(2.0*pi) * sigma)
如果您真的想要原始问题的答案,您可以查看您感兴趣的值的 X 值的最小增量(尾数中的一个最低有效位)。那将是您的 delta X,然后您可以计算实际答案(警告 - 它不仅很小,而且可能很难在不遇到重大舍入错误的情况下计算它。会很难。)
进一步思考:
您测试该值的限制是否在 +- 3 sigma 范围内,并继续进行直到达到。这意味着您人为地略微增加了概率 - 因为您的值始终来自范围的特定部分(总概率小于 1),您需要将 PDF 乘以 (1/p),其中 p 是从-3 到3 或0.9973 的标准正态分布的积分。因此,在您的情况下,上述公式会低估0.27% 的概率。
suggestion 为您的代码提供一些样式建议。考虑以下内容(为您的代码提供等效结果):
function [new_E11, new_E22] = elasticmodulusrng()
% returns randomly distributed modulus
% keeping the value within +- 3 standard deviations
% identify the constants up front
mean11 = 136e9;
stdv11 = 9.067e9;
mean22 = 8.9e9;
stdv11 = 2.373e9;
% compute the values
new_E11 = normRandLimit(mean11, stdv11, [-3 3]);
new_E22 = normRandLimit(mean22, stdv22, [-3 3]);
function rr = normRandLimit(m, s, b)
% helper function in the same file
% returns a normally distributed random variate
% with mean m, standard deviation s
% within limits [mean + b(1)*s, mean + b(2)*s]
while true
rr = randn(1); % doesn't need statistics toolbox - scale later
if( rr > b(1) && rr < b(2) )
break; % found acceptable value
end
end
% now apply scaling:
rr = rr * s + m;
注意事项:
- “幻数”有一个好听的名字,而且都在代码的最前面
- “限制范围内的随机数”的计算被归为一个单独的函数
- 使用
randn 而不是normrnd(因此无需绑定统计工具箱许可证)
- 计算“好数字”后的计算缩放
- 已消除重复代码
- 从结构(和 cmets)可以看出发生了什么
所有这些加起来就是“更好”的代码——从某种意义上说,它更容易调试和维护。而且当你在六个月后看到自己的代码时,你仍然可以阅读它......