gpt4 book ai didi

javascript - 如何在纯 JavaScript(不是 Node.js)中生成一个范围内的随机 BigInt?

转载 作者:行者123 更新时间:2023-12-05 05:49:15 28 4
gpt4 key购买 nike

对于特定范围内的 JavaScript 中的基本随机数,有一个很好的问题:

Generating random whole numbers in JavaScript in a specific range?

function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}

如何在纯 JavaScript 中使用 BigInt 做同样的事情(即不使用 Node.js 或使用 crypto.randomBytes)?跨环境工作的东西(有 BigInt 支持)?

(大声思考...)您不能只更改要附加 n 的公式中的数字以使它们成为 BigInt,因为 Math.random() 返回一个非 BigInt。 Math.random() 的示例返回 0.5427862726372646,即小数点后 16 位。但是如果我有一个类似于 412233344445555566666677777778888888999999997n 的 BigInt,那是一个 47 位数字,所以乘以 0.5427862726372646 * (10**46) 得到 5.427822656537e+ 。将其包装在 BigInt 中,您将得到 BigInt(0.5427862726372646 * (10**46)) 等于 5427862726372646467145376115182187925303459840n。嗯……这就是解决方案吗?

41223334444555556666667777777888888889999999997n
5427862726372646467145376115182187925303459840n

结果如何?如果那是我刚才偶然发现的解决方案,试图问这个问题。您能否仔细检查并确认这是正确的,并可能解释一下常规 JavaScript 数字(使用 e+45 表示)在传递给 BigInt 构造函数时如何产生看似准确详细的BigInt值?那我试试吧。

BigInt(Math.random() * (10 ** 45))
// => 329069627052628509799118993772820125779492864n

嗯。我不明白,Math.random() 只到 16 位?

const rand = Math.random()
// => 0.7894008119121056

BigInt(rand * (10 ** 45))
// => 789400811912105533187528403423793891092987904n

这没有意义,我本以为:

789400811912105600000000000000000000000000000

也就是说,0.7894008119121056 移动了 45 位小数。

不确定为什么会这样,这只在 Chrome 中吗?

最后一个测试:

console.log('10 ** 35 <=> 10 ** 45')
console.log(rint(10 ** 35, 10 ** 45).toString())
console.log('10 ** 35 <=> 10 ** 45')
console.log(rint(10 ** 35, 10 ** 45).toString())
console.log('10 ** 20 <=> 10 ** 40')
console.log(rint(10 ** 20, 10 ** 40).toString())
console.log('10 ** 20 <=> 10 ** 40')
console.log(rint(10 ** 20, 10 ** 40).toString())

function rint(min, max) {
return BigInt(Math.random() * max - min + 1) + BigInt(min)
}

我得到例如:

10 ** 35 <=> 10 ** 45 485253180777775593983353876860021068179439616n
10 ** 35 <=> 10 ** 45 178233587725359997576391063983941630941986816n
10 ** 20 <=> 10 ** 40 8245114695932740733462636549119006474240n
10 ** 20 <=> 10 ** 40 7214182941774644957099293094661617352704n

那么这是一个正确的实现吗? 那么您将如何实现它以获取从 0 到任意大的 BigInt 的随机整数?

最佳答案

JavaScript 数字始终按照国际 IEEE 754 标准存储为 double float 。

此格式以 64 位存储数字(其中数字(分数)存储在位 0 到 51 中,指数存储在位 52 到 62 中,符号存储在位 63 中)。

Math.random() 仅返回正数,因此符号位无关紧要。这意味着 Math.random() 不能产生超过 2 ** 63 个不同的值,实际上它比那个要少,因为 Math.random( ) 仅返回 0 和 1 之间的值(这意味着根据实现,不使用或不使用所有 11 个指数位)。当您的范围大于该范围时,Math.random() 将无法生成该范围内的每个数字。在限制范围内,您的方法应该有效。

关于javascript - 如何在纯 JavaScript(不是 Node.js)中生成一个范围内的随机 BigInt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70677751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com