gpt4 book ai didi

javascript - 如何使用 window.crypto.getRandomValues 获取特定范围内的随机值

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:16 24 4
gpt4 key购买 nike

我们一直在使用 Math.random 来获取 4000-64000 之间的随机数。:

Math.floor(Math.random() * 60000 + 4000);

我们现在必须用密码学上更安全的随机数生成器替换它。在搜索了这个问题之后,我们决定继续window.crypto.getRandomValues。我无法弄清楚如何使用它来获取特定范围之间的随机数。有人可以帮忙吗。

最佳答案

对于给定的最小值和最大值,公式 u \cdot \left ( 1 - {2^u \boldsymbol{\textup{mod}} (max-min) \over 2^u} \right ) \sum_{i=0}^{\infty} \left( 2^u \boldsymbol{\textup{mod}} (max-min) \over 2^u \right )^i (i + 1)描述如果您一次请求 u 位并在返回结果会引入偏差时重试,您将平均使用多少位。

幸运的是,最佳策略是一次简单地请求 ceil(log2(max - min + 1)) 位。无论如何,我们只能使用 crypto.getRandomValues 获取完整字节,因此如果每次函数调用都调用一次 crypto.getRandomValues,我们能做的最好的事情是:

// Generate a random integer r with equal chance in  min <= r < max.
function randrange(min, max) {
var range = max - min;
if (range <= 0) {
throw new Exception('max must be larger than min');
}
var requestBytes = Math.ceil(Math.log2(range) / 8);
if (!requestBytes) { // No randomness required
return min;
}
var maxNum = Math.pow(256, requestBytes);
var ar = new Uint8Array(requestBytes);

while (true) {
window.crypto.getRandomValues(ar);

var val = 0;
for (var i = 0;i < requestBytes;i++) {
val = (val << 8) + ar[i];
}

if (val < maxNum - maxNum % range) {
return min + (val % range);
}
}
}

如果你生成很多值,你可以考虑一些优化,即提前请求更多字节(即更大的数组)。如果您的范围变小(比如您想掷硬币),那么以基于位的方式工作也可能是有益的,即预先请求很多位,然后只用完您真正需要的随机位。

关于javascript - 如何使用 window.crypto.getRandomValues 获取特定范围内的随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41437492/

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