首页 > 解决方案 > 如何(可能)获得 0 到 255 之间的所有均匀分布的浮点值

问题描述

假设integer下面是由一个真正的随机数生成器产生的,并且数字在0和之间随机变化255

let integer = 241 // true random number

对于我正在处理的应用程序,我需要将该数字转换为介于0和之间的浮点小数1,看起来更像Math.random().

所以,

let float = integer/((2**8)-1)

如果integer更改为 0 到 255 之间的新随机整数,这会提供其他“质量”浮点数吗?例如,请求 Uint16 之间的数字 0–65535let float = integer/((2**16)-1)是更好的方法吗?

请注意,我这样做的目的不是为了安全、加密或密码学。我只需要添加类似于Math.random(). 我使用这些数字插入使用 Box Müller 的归一化变换,以创建模拟随机游走。

标签: javascriptrandom

解决方案


在 JavaScript 中,数字被实现为具有 53 个有效位精度的二进制浮点数格式(更具体地说,是 IEEE 754 的 binary64 格式)。

但是,通过将整数与常数相乘或除以生成统一的浮点数(通常是这种情况)通常会使一些浮点数没有发生的机会,即使它们位于正确的范围内,即使它们可以用相关的浮点格式表示。有关详细信息,请参阅 F. Goualard,“通过整数除法生成随机浮点数:案例研究”。

相反,可以执行一个更复杂的过程来为每个浮点数提供预期的发生概率,就像我所做的那样,例如. 请注意此过程的重要性。另请参阅我对问题的回答:包含范围内的随机浮点双精度


推荐阅读