首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在matlab中生成在整个可能范围内均匀分布的随机浮点数

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

Stack Overflow用户
提问于 2013-02-01 01:08:59
回答 1查看 1.6K关注 0票数 2

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

我想生成+/- (2-2^-23)*2^127范围内的所有数字,它表示基于IEEE-754标准的可能的32位浮点数的范围。问题是只生成较大的数值,而我希望也包含较小的数值(接近并包括0)。如果我们取生成的所有数字的绝对值,然后找到最小的(我在代码下面复制了输出),就会看到这一点。

到目前为止,我用MATLAB编写了以下代码:

代码语言:javascript
运行
复制
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)

下面是输出:

代码语言:javascript
运行
复制
minimum =

 -3.4026e+038


smallest =

  8.4046e+033


maximum =

  3.4027e+038
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-01 02:01:57

(看在上帝的份上,看在小青苹果的份上,你为什么要这样做呢?)

我的观点是,使用MATLAB的功能来做这件事。学习使用向量和数组。将运算应用于整个数字数组。这就是像MATLAB这样的工具的闪亮之处。在此之前,您还不如使用低级语言,但没有使用低级工具所带来的速度优势。

好了,我们该如何解决这个问题呢?

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

  1. A random sign
  2. A random指数
  3. A random mantissa

使用向量运算完成所有这些操作。

代码语言:javascript
运行
复制
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;

它们覆盖了整个范围吗?看起来是这样的。

代码语言:javascript
运行
复制
min(abs(R))
ans =
      7.44202895026248e-41

max(R)
ans =
      3.17337113940593e+38

min(R)
ans =
      -3.3810631675676e+38

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14631303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档