我可以在整个 space 上生成一个随机浮点数吗?
Can I generate a random float on the whole space?
我正在尝试生成一个范围从 Number.MIN_VALUE 到 Number.MAX_VALUE 的随机数,但由于缓冲区溢出(我猜),以下算法失败了:
var randFloat = Math.floor(Math.random() * (Number.MAX_VALUE - Number.MIN_VALUE)) + Number.MIN_VALUE
有什么办法吗?
你可以做什么:
function IEEEToDouble(f)
{
return new Float64Array(f.buffer)[0];
}
var array = new Uint32Array(2); // here we allocate a 2 element unsigned 32 bit ints
window.crypto.getRandomValues(array); // here we generate 64 bits of random values
var f = IEEEToDouble(array); // and convert 64 bits to a double precision number
这会生成一个均匀分布的双精度 IEEE754 数字。因此,整个 space 中的每个可能值都同样有可能通过此代码获得,包括 NaN
s(实际上有很多 NaN
s - 2^53 - 2
)和Infinity
s.
参考文献:
- 从
借用的IEEEToDouble
函数的初始实现
- RandomSource.getRandomValues()
我正在尝试生成一个范围从 Number.MIN_VALUE 到 Number.MAX_VALUE 的随机数,但由于缓冲区溢出(我猜),以下算法失败了:
var randFloat = Math.floor(Math.random() * (Number.MAX_VALUE - Number.MIN_VALUE)) + Number.MIN_VALUE
有什么办法吗?
你可以做什么:
function IEEEToDouble(f)
{
return new Float64Array(f.buffer)[0];
}
var array = new Uint32Array(2); // here we allocate a 2 element unsigned 32 bit ints
window.crypto.getRandomValues(array); // here we generate 64 bits of random values
var f = IEEEToDouble(array); // and convert 64 bits to a double precision number
这会生成一个均匀分布的双精度 IEEE754 数字。因此,整个 space 中的每个可能值都同样有可能通过此代码获得,包括 NaN
s(实际上有很多 NaN
s - 2^53 - 2
)和Infinity
s.
参考文献:
- 从 借用的
- RandomSource.getRandomValues()
IEEEToDouble
函数的初始实现