gpt4 book ai didi

javascript - 如何使用 crypto.getRandomValues 中的随机数对数组进行随机化?

转载 作者:行者123 更新时间:2023-11-28 20:20:58 25 4
gpt4 key购买 nike

我知道您可以使用 Fisher-Yates 在 JavaScript 中对数组进行打乱随机播放。然而,这使用 Math.random 作为随机数。我想知道您是否可以使用 window.crypto.getRandomValues() 获得更好的洗牌效果随机数源?

我已经尝试了一下,效果如下。 getRandomIntInRange() 函数使用 rejection sampling并指定示例 here .

请告诉我这是否是正确的方法,或者您是否可以想到更好的方法。 JSFiddle here .

$(document).ready(function()
{
var dataArray = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14'];
var shuffledArray = shuffleArray(dataArray);

console.log(shuffledArray);
});

function getRandomIntInRange(min, max) {

var range = max - min + 1;
var maxRange = 256;
var byteArray = new Uint8Array(1);

// Fill byteArray with 1 random number
window.crypto.getRandomValues(byteArray);

// If outside of range, get another
if (byteArray[0] >= Math.floor(maxRange / range) * range)
{
return getRandomIntInRange(min, max);
}

return min + (byteArray[0] % range);
}

function shuffleArray(dataArray) {

var counter = dataArray.length, temp, index;

while (counter > 0)
{
index = getRandomIntInRange(0, counter - 1);
counter--;

temp = dataArray[counter];
dataArray[counter] = dataArray[index];
dataArray[index] = temp;
}

return dataArray;
}

最佳答案

这段代码没有任何问题(尽管使用字符串表示数字 1 到 14 似乎毫无意义地缓慢且复杂——仅使用数字 1 到 14 有什么问题吗?)。您当然可以自由地使用您喜欢的任何 RNG 算法。但不同的算法被设计为最适合不同的任务。一般来说,为模拟而设计的 RNG 对于密码学来说并不安全;加密安全的 RNG 对于模拟来说是可以接受的,但可能会太慢。如果你只想玩几个游戏,没问题。但是,如果您想模拟十亿手二十一点或扑克,或者对数十亿个数据点进行蒙特卡洛集成,那么使用加密 RNG 很可能会使您的代码从几分钟运行到几周运行,但没有任何好处。

关于javascript - 如何使用 crypto.getRandomValues 中的随机数对数组进行随机化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330695/

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