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

时间:2013-01-31 17:08:59

标签: matlab random floating-point 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)

这是输出:

minimum =

 -3.4026e+038


smallest =

  8.4046e+033


maximum =

  3.4027e+038

1 个答案:

答案 0 :(得分:5)

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

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

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

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

  1. 随机标志
  2. 随机指数
  3. 随机尾数
  4. 使用矢量操作完成所有操作。

    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
    

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

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