JavaScript:请向我解释这行代码的含义

3

我有一个简单的数组:

var RedirUrl = new Array(4);
RedirUrl[0] = 'http://mafi.se/mf_redir/new_install_'+this_version+'.html';
RedirUrl[1] = 'http://ifurls.com/mf_redir/new_install_'+this_version+'.html';
RedirUrl[2] = 'http://ez.se/xml-update/mf_redir/new_install_'+this_version+'.html';
RedirUrl[3] = 'http://ilovre.net/mf_redir/new_install_'+this_version+'.html';
RedirUrl[4] = 'http://rihel.com/mf_redir/new_install_'+this_version+'.html';

然后

RedirUrl.sort(function() {return 0.5 - Math.random()}) 

最后一部分让我感到困惑。 我理解了“sort”,也理解了Math.random,但是return 0.5让我感到困惑……这究竟是什么意思呢?

(不用说了,我是从网上下载的,因为它可以实现我想要的功能……但我只是不理解它。)

6个回答

7
它使用一种排序方法来对URL列表进行排序,该方法在大约一半的情况下随机返回大于或小于0的值。 Math.random()返回介于0和1之间的数字。因此,0.5-Math.random()是一个介于-0.5和0.5之间的随机确定值。这些值中约有一半大于零,另一半小于零。
因此,比较函数大约一半的时间会说第一个对象大于第二个对象,另一半时间则相反。
这是一种简单的随机洗牌数组的方法。正如评论中指出的那样,它不是一个很好的洗牌数组的方法(因为分布不均匀)。 这个问题有一个已知良好的Fisher-Yates shuffle的可行实现。

+1:这肯定不是一个好的洗牌算法。它可能会返回矛盾的结果,例如 "a<b,b<c 和 c<a"。 - Shamim Hafiz - MSFT
1
http://adrianquark.blogspot.com/2008/09/how-to-shuffle-array-correctly.html 看起来很有趣。 - mplungjan
在您的意见中,哪种洗牌算法会更好? - Ryan
1
@Ryan 看看这个更好的分布。它使用了_.sortBy,虽然不是完美的,但“足够好”。 - Raynos

1

看起来这个脚本会通过让比较函数随机返回-0.5到+0.5之间的值来随机洗牌数组。

此外,它生成长度为4的数组,但是却填充了5个项目。

我建议使用这种格式。

var RedirUrl = [
'http://mafi.se/mf_redir/new_install_'+this_version+'.html',
'http://ifurls.com/mf_redir/new_install_'+this_version+'.html',
'http://ez.se/xml-update/mf_redir/new_install_'+this_version+'.html',
'http://ilovre.net/mf_redir/new_install_'+this_version+'.html',
'http://rihel.com/mf_redir/new_install_'+this_version+'.html'
]

1

sort() 接受一个用于比较数组中值的函数作为参数。这里 sort() 方法被告知给出 0.0 到 1.0 之间的随机数,而 0.5 是为了使随机数在 -0.5 到 0.5 之间,这样就可以随机地说出小于或大于。


1
一个比较函数应该返回小于 0 表示第一个值更小,大于 0 表示它更大,等于 0 表示相等。Math.random() 返回一个介于 0 和 1 之间的数字。因此,通过做减法,你可以得到随机排序!

1

这将打乱数组。如果在Array.sort()中使用函数,则通常有两个参数进行比较Array.sort(function(a,b){})。返回值小于0表示ab之前,大于0表示ab之后,而0表示它们具有相同的顺序。使用0.5 - Math.random()意味着您应该随机获得大于或小于0的值。


1

这里sort将根据您传递给它的比较函数执行排序。

在您的情况下,它是:

function() {return 0.5 - Math.random()}

假设您熟悉基于比较的排序,该函数应返回一个负值,表示左侧值较小,如果它们相等,则返回,如果左侧值大于右侧值,则返回正值,就像C函数strcmp()。

查看您拥有的函数,它将尝试执行随机排序,即尝试对数组进行洗牌。

另外需要注意的是,这种洗牌算法并不理想。它会自相矛盾。由于一切都会随机发生,可能会导致某些情况,例如:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接