相关疑难解决方法(0)

使用JavaScript Array.sort()方法进行混洗是否正确?

我用他的JavaScript代码帮助了一个人,我的眼睛被一个看起来像这样的部分抓住了:

function randOrd(){
  return (Math.round(Math.random())-0.5);
}
coords.sort(randOrd);
alert(coords);
Run Code Online (Sandbox Code Playgroud)

我的第一个是:嘿,这不可能奏效!但后来我做了一些实验,发现它确实至少似乎提供了很好的随机结果.

然后我做了一些网络搜索,几乎在顶部发现了一篇文章,这段代码最简单地被复制.看起来像一个相当可敬的网站和作者......

但我的直觉告诉我,这一定是错的.特别是因为ECMA标准没有规定排序算法.我认为不同的排序算法会导致不同的非均匀混洗.一些排序算法甚至可能无限循环...

但你怎么看?

而另一个问题是......现在我将如何衡量这种改组技术的结果是多么随机?

更新:我做了一些测量并将结果发布在下面作为答案之一.

javascript sorting random shuffle

124
推荐指数
6
解决办法
5万
查看次数

密码安全阵列shuffle

我试图使用加密安全的熵源来对阵列进行洗牌.

我发现了一个类似的问题,关于在这里改组数组如何随机化(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)

这种实施是否正确且无偏见?

笔记:

  • 为了我的目的,该数组最多包含~100个元素
  • 运行nodejs v6.10.3 LTS(已编译)

javascript arrays cryptography shuffle node.js

5
推荐指数
1
解决办法
448
查看次数

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

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

Math.floor(Math.random() * 60000 + 4000);
Run Code Online (Sandbox Code Playgroud)

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

javascript java random

3
推荐指数
2
解决办法
2279
查看次数

标签 统计

javascript ×3

random ×2

shuffle ×2

arrays ×1

cryptography ×1

java ×1

node.js ×1

sorting ×1