我试图在MATLAB中以单精度生成一个均匀分布的浮点值数组。
我想生成+/-(2-2 ^ -23)* 2 ^ 127范围内的所有数字,它表示基于IEEE-754标准的可能32位浮点数的范围。问题是只生成大量数字,我想要包括小幅度数字(接近和包括0)。如果我们取所有生成的数字的绝对值然后找到最小的(我已经将代码复制到代码下面),就会看到这一点。
到目前为止,我在MATLAB中有这段代码:
numtogenerate = 20000;
% Preallocate for speed
generatednumber(numtogenerate) = 0;
for i = 1:numtogenerate
generatednumber(i) = rand*(2-2^-23)*2^127*2 - 2^127*(2-2^-23);
end
minimum = min(generatednumber)
smallest = min(abs(generatednumber))
maximum = max(generatednumber)
hist(generatednumber)
这是输出:
minimum =
-3.4026e+038
smallest =
8.4046e+033
maximum =
3.4027e+038
答案 0 :(得分:5)
(为什么以上帝的名义和小绿苹果你会在循环中这样做?)
我的观点是,使用MATLAB的功能来做。学习使用向量和数组。将操作应用于整个数字数组。这就是像MATLAB这样的工具如何发光。除非你这样做,否则你可能会使用较低级别的语言,但没有使用较低级别工具所获得的速度优势。
好的,咆哮,所以我们如何解决这个问题?
使用三个不同的随机值生成每个数字。
使用矢量操作完成所有操作。
numtogenerate = 20000;
% the sign
S = (rand(numtogenerate,1) < 0.5)*2 - 1;
% The exponent
E = floor(rand(numtogenerate,1)*256) - 128;
% The mantissa
M = rand(numtogenerate,1)*2 - 2^-23;
% bring it all together
R = S.*M.*2.^E;
它们涵盖了整个范围吗?看来是这样。
min(abs(R))
ans =
7.44202895026248e-41
max(R)
ans =
3.17337113940593e+38
min(R)
ans =
-3.3810631675676e+38
假设我得到每个部分的范围正确,这应该基本上产生所需范围内的每个可能的值。
顺便说一句,这些不是均匀分布的数字,至少不是通常在数学中应用的术语。