Math.random 产生了多少熵?
How much entropy does Math.random generate?
我想生成一个非常大的随机数。我不需要这个数字是加密安全的。因此,我没有使用 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));
然而,这似乎有点浪费,因为 JavaScript 中的数字是 64 bits long:
在我看来,我们至少应该能够恢复尾数的所有52位。我们可以从 JavaScript 中 Math.random
生成的数字中提取多少位熵,如何提取?
确定性算法(包括伪随机数生成器)本身不能生成熵;它必须来自外部,例如算法接收的种子。
但是注意,允许实现使用任意"implementation-dependent algorithm or strategy",不一定是确定性算法,只要数是"chosen randomly or pseudo randomly with approximately uniform distribution over"区间[0, 1).因此,Math.random()
是否实际使用熵同样取决于实现 - 也没有强制要求收集熵以播种 PRNG(如果实现使用一个)的特定策略。
我想生成一个非常大的随机数。我不需要这个数字是加密安全的。因此,我没有使用 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));
然而,这似乎有点浪费,因为 JavaScript 中的数字是 64 bits long:
在我看来,我们至少应该能够恢复尾数的所有52位。我们可以从 JavaScript 中 Math.random
生成的数字中提取多少位熵,如何提取?
确定性算法(包括伪随机数生成器)本身不能生成熵;它必须来自外部,例如算法接收的种子。
但是注意,Math.random()
是否实际使用熵同样取决于实现 - 也没有强制要求收集熵以播种 PRNG(如果实现使用一个)的特定策略。