我用他的JavaScript代码帮助了一个人,我的眼睛被一个看起来像这样的部分抓住了:
function randOrd(){
return (Math.round(Math.random())-0.5);
}
coords.sort(randOrd);
alert(coords);
Run Code Online (Sandbox Code Playgroud)
我的第一个是:嘿,这不可能奏效!但后来我做了一些实验,发现它确实至少似乎提供了很好的随机结果.
然后我做了一些网络搜索,几乎在顶部发现了一篇文章,这段代码最简单地被复制.看起来像一个相当可敬的网站和作者......
但我的直觉告诉我,这一定是错的.特别是因为ECMA标准没有规定排序算法.我认为不同的排序算法会导致不同的非均匀混洗.一些排序算法甚至可能无限循环...
但你怎么看?
而另一个问题是......现在我将如何衡量这种改组技术的结果是多么随机?
更新:我做了一些测量并将结果发布在下面作为答案之一.
我试图使用加密安全的熵源来对阵列进行洗牌.
我发现了一个类似的问题,关于在这里改组数组如何随机化(shuffle)一个JavaScript数组?.然而,几乎所有解决方案都使用Math.random,这是不安全的.不幸的是,我没有在这个问题上发表评论/发帖的声誉.
这是我提出的解决方案,它使用Durstenfeld shuffling与CSPRNG配对,在给定范围内生成随机整数(由random-number-csprng lib提供).
const randomNumber = require("random-number-csprng");
async function secureShuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = await randomNumber(0, i);
const temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
这种实施是否正确且无偏见?
笔记:
我们一直在使用Math.random获取4000-64000之间的随机数:
Math.floor(Math.random() * 60000 + 4000);
Run Code Online (Sandbox Code Playgroud)
我们现在必须使用更加加密的安全随机数生成器来替换它.在搜索了这个问题之后,我们决定使用window.crypto.getRandomValues.我无法弄清楚如何使用它来获得特定范围之间的随机数.有人可以帮忙吗?