这是我多年来一直想到的事情,但我从来没有花时间问过.
许多(伪)随机数生成器生成0.0到1.0之间的随机数.在数学上,此范围内有无限数,但是double
是浮点数,因此具有有限的精度.
所以问题是:
double
在0.0和1.0之间有多少个数字?注意:如果它有所不同,我double
特别感兴趣的是Java的定义.
我想生成一个非常大的随机数。我不需要这个数字是加密安全的。因此,我没有使用crypto.getRandomValues
. 目前,我生成的随机数如下:
const random = length =>
Math.floor(length * Math.random());
const padding = (length, character, string) =>
(new Array(length + 1).join(character) + string).slice(string.length);
const randomBits = bits =>
padding(bits, '0', random(Math.pow(2, bits)).toString(2));
const getRandom = bits =>
bits <= 32 ? randomBits(bits) : randomBits(32) + getRandom(bits - 32);
console.log(' 1 2 3 4 5 6');
console.log(getRandom(64));
Run Code Online (Sandbox Code Playgroud)
然而,这似乎有点浪费,因为 JavaScript 中的数字是64 位长的:
在我看来,我们至少应该能够恢复尾数的所有 52 位。我们可以从Math.random
JavaScript生成的数字中提取多少位熵,以及如何提取?