我正在帮助别人使用他的JavaScript代码,但我的眼睛被一段看起来像这样的部分所吸引:
function randOrd(){
return (Math.round(Math.random())-0.5);
}
coords.sort(randOrd);
alert(coords);
我的第一个想法是: 嘿,这可能行不通! 但是后来我做了一些实验,发现它确实确实至少提供了很好的随机结果。
但是我的直觉告诉我,这一定是错误的。特别是由于ECMA标准未指定排序算法。我认为不同的排序算法将导致不同的不均匀混洗。一些排序算法甚至可能无限循环…
但是你觉得呢?
还有另一个问题……我现在将如何测量这种改组技术的结果的随机性?
更新: 我做了一些测量,并将结果发布在下面作为答案之一。
这从来不是我最喜欢的改组方式,部分原因是您所说的是特定于实现的。尤其是,我似乎还记得,从Java或.NET(不确定哪个)排序的标准库通常可以检测到是否最终在某些元素之间进行了不一致的比较(例如,首先声明A < B
和B < C
,然后声明C < A
)。
最后,它还会以比您真正需要的更复杂的(就执行时间而言)洗牌结束。
我更喜欢shuffle算法,该算法可以有效地将集合划分为“ shuffled”(在集合的开头,最初为空)和“
unshuffled”(集合的其余部分)。在算法的每个步骤中,选择一个随机的未改组元素(可以是第一个元素),然后将其与第一个未改组的元素交换-
然后将其视为已改组(即,在精神上移动分区以将其包括在内)。
这是O(n),只需要对随机数生成器进行n-1次调用,这很好。它还会产生真正的随机播放-任何元素,不管其原始位置如何(假设RNG合理),都有1 /
n的机会出现在每个空间中。排序后的版本近似于均匀分布(假设随机数生成器没有两次选择相同的值,如果返回随机双精度数则不太可能),但我发现更容易推断出随机版本:)
这种方法称为Fisher-Yates随机播放。
我认为最好的做法是对这种改组进行一次编码,然后在需要改组项目的任何地方重用它。然后,您不必担心可靠性或复杂性方面的排序实现。仅有几行代码(我不会在JavaScript中尝试!)
将在维基百科的文章值得一读的一般洗牌的差实现的部分,所以你知道,以避免什么(尤其是洗牌的算法部分)有关排序随机投影会谈。
本文向大家介绍使用JavaScript Array.sort()方法进行改组是否正确?,包括了使用JavaScript Array.sort()方法进行改组是否正确?的使用技巧和注意事项,需要的朋友参考一下 是的,您可以使用JavaScript Array.sort()方法进行改组。让我们看看 示例
问题内容: 我对swig中的typemap和如何使用数组感到迷茫。我准备了一个使用swig在java和c之间使用数组的工作示例,但是我不知道这是否是正确的方法。 基本上,我想将字节数组从Java 传递给c作为“ signed char *” +它的大小,在c中对其进行修改并查看java中的更改,并在c中创建一个数组并在Java中使用它。 *在C中被修改为Java或其他的缓冲区?](http://c
本文向大家介绍JavaScript判断用户是否对表单进行了修改的方法,包括了JavaScript判断用户是否对表单进行了修改的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript判断用户是否对表单进行了修改的方法。分享给大家供大家参考。具体分析如下: 这段JS代码可以判断出用户是否对表单内容进行了修改,如果修改了表单,并退出浏览器,则会提醒用户是否要保存表单的内容,是非
本文向大家介绍JavaScript使用RegExp进行正则匹配的方法,包括了JavaScript使用RegExp进行正则匹配的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript使用RegExp进行正则匹配的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。
在我的React项目中,我有: 没有标题的登录组件 问题:我应该如何构建我的路由器从登录页面开始,当我点击登录时,路由器会把我带到仪表板?
问题内容: 我有一个不时更新数据集的数据库。在这里,可能发生的是交付了数据库中已经存在的数据集。 目前,我首先要做的是 检查是否已经存在具有这些数据的数据集(使用WHERE语句中的数据)。如果没有返回任何值,则说明我正在执行INSERT。 但这对我来说似乎有点复杂。所以我的问题是:是否有某种条件式INSERT仅在不存在新数据集的情况下才添加它? 我正在使用 SmallSQL 问题答案: 您几乎可以