gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:14:57 25 4
gpt4 key购买 nike

我正在尝试在 MATLAB 中以单精度生成一组均匀分布的浮点值。

我想生成 +/- (2-2^-23)*2^127 范围内的所有数字,它表示基于 IEEE-754 标准的可能的 32 位 float 范围。问题是只生成了大数量级的数字,我希望也包括小数量级的数字(接近并包括 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

最佳答案

(以上帝和小青苹果的名义,你为什么要循环执行此操作?)

我的观点是,使用 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;

它们是否涵盖整个范围?好像是的。

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

max(R)
ans =
3.17337113940593e+38

min(R)
ans =
-3.3810631675676e+38

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

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

关于matlab - 如何在matlab中的整个可能范围内生成均匀分布的随机 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com