如何在matlab中的整个可能范围内生成均匀分布的随机浮点数

Ver*_*ian 2 random floating-point matlab numbers

我试图在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)
Run Code Online (Sandbox Code Playgroud)

这是输出:

minimum =

 -3.4026e+038


smallest =

  8.4046e+033


maximum =

  3.4027e+038
Run Code Online (Sandbox Code Playgroud)

小智 5

(为什么以神的名义和小绿苹果你会在循环中这样做?)

我的观点是,使用MATLAB的功能来做.学习使用向量和数组.将操作应用于整个数字数组.这就是像MATLAB这样的工具如何发光.除非你这样做,否则你可能会使用较低级别的语言,但没有使用较低级别工具所获得的速度优势.

好吧,咆哮,所以我们如何解决这个问题?

使用三个不同的随机值生成每个数字.

  1. 一个随机的标志
  2. 随机指数
  3. 一个随机的尾数

使用矢量操作完成所有操作.

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;
Run Code Online (Sandbox Code Playgroud)

它们涵盖了整个范围吗?看来是这样.

min(abs(R))
ans =
      7.44202895026248e-41

max(R)
ans =
      3.17337113940593e+38

min(R)
ans =
      -3.3810631675676e+38
Run Code Online (Sandbox Code Playgroud)

假设我得到了每个部件的正确范围,这应该基本上产生所需范围内的所有可能值.

顺便说一句,这些不是均匀分布的数字,至少不是通常在数学中应用的术语.