如何使用crypto.getRandomValues中的随机数随机化数组
How to randomize an array with random numbers from crypto.getRandomValues?
我知道您可以使用Fisher Yates shuffle在JavaScript中打乱数组。然而,它使用Math.random作为随机数。我想知道你是否可以使用window.crypto.getRandomValues()为随机数源获得更好的洗牌?
我试过低于这个标准。getRandomIntInRange()函数使用拒绝采样和此处指定的示例。
请告诉我这是否是正确的方法,或者你是否能想出更好的方法。
$(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对于模拟来说是可以接受的,但可能太慢了。如果你只想玩几个游戏,没问题。但是,如果你想模拟十亿只手的21点或扑克,或者用数十亿个数据点进行蒙特卡洛集成,使用加密RNG很可能会让你的代码从几分钟内运行变成几周内运行,但没有任何好处。
相关文章:
- $(document).height()在刷新时随机化值(Safari 5.1.10)
- 将键盘使用与 Qualtrics 中的答案随机化相结合
- 我怎样才能随机化 HTML 元素的颜色属性
- 通过AJAX调用PHP随机化器的输出
- 如何在JS中随机化backgroundPosition而不使用鼠标移动来制作万花筒的动画
- 使用Javascript对RGBA颜色进行光标控制的形状随机化
- 如何在一个随机化的有序列表中随机化多个无序列表
- 如何使用JavaScript随机化有序列表
- 使用JavaScript随机化html标记
- 可以'我的单词随机化器脚本不能正常循环
- 如果语句是假的 JavaScript,则再次随机化数字
- 函数随机化 - 我可以让它错过一个页面并且该页面上只有一个图像吗?可湿性粉剂
- 随机化网页上的图像和颜色对
- 随机侮辱生成器(随机化结果)
- Javascript:通过在while循环内推送/拼接来随机化数组
- 构建一个简单的随机化器,其中包括一个点、一个下划线、字母 A 和字母 B
- 随机化并在页面加载时显示给定数量的 if 元素
- jQuery Rotator是按字母顺序排列的,我怎样才能在我的主页上随机化
- 随机播放函数随机化字母
- 如何使用crypto.getRandomValues中的随机数随机化数组