我用他的JavaScript代码帮助了一个人,我的眼睛被一个看起来像这样的部分抓住了:
function randOrd(){
return (Math.round(Math.random())-0.5);
}
coords.sort(randOrd);
alert(coords);
Run Code Online (Sandbox Code Playgroud)
我的第一个是:嘿,这不可能奏效!但后来我做了一些实验,发现它确实至少似乎提供了很好的随机结果.
然后我做了一些网络搜索,几乎在顶部发现了一篇文章,这段代码最简单地被复制.看起来像一个相当可敬的网站和作者......
但我的直觉告诉我,这一定是错的.特别是因为ECMA标准没有规定排序算法.我认为不同的排序算法会导致不同的非均匀混洗.一些排序算法甚至可能无限循环...
但你怎么看?
而另一个问题是......现在我将如何衡量这种改组技术的结果是多么随机?
更新:我做了一些测量并将结果发布在下面作为答案之一.
在这个线程中,我们看到了这个简单而漂亮的随机数组算法:
function shuffle<T>(array: T[]): T[] {
return array.sort(() => Math.random() - 0.5);
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到评论说这个算法有偏见。但我制作了一个简单的脚本来创建数组最后一个元素在洗牌后结束的索引的经验概率分布:
function shuffle<T>(array: T[]): T[] {
return array.sort(() => Math.random() - 0.5);
}
Run Code Online (Sandbox Code Playgroud)
我们期望无偏算法具有均匀分布,并且结果非常接近该分布,即使对于具有 100 个元素的数组也是如此。那么为什么这个算法会有偏差呢?