我有这个简单的数组:
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()})
最后一点让我感到困惑。 我理解“排序”,我理解Math.random
但return 0.5
让我困惑......究竟是什么?
(不用说我把它从网上下载,就像我想做的那样...但我只是不明白它。)
它使用排序方法对URL列表进行排序,该排序方法在大约一半的情况下随机返回大于或小于0的值。
Math.random()
返回0和1之间的数字。因此0.5 - Math.random()
是在-0.5和0.5之间随机确定的值。 这些值中大约有一半大于零,其中一半小于零。
因此,大约一半的时间比较函数会说第一个对象大于第二个对象的一半时间。
这是一种随机洗牌的简单方法。 正如评论中指出的那样,这不是一个改组数组的好方法(因为分布不均匀)。
这个问题有一个已知良好的Fisher-Yates shuffle的工作实现。
sort()接受一个函数来比较数组中的值作为它的参数。 这里sort()方法被告知给出一个介于0.0和1.0之间的随机数,而0.5用于使随机数在-0.5到0.5之间,这随机地说小于或大于。
比较器函数应返回<0以指示第一个值更小,> 0表示它更大,0表示相等。 Math.random()返回一个介于0和1之间的数字。因此,通过减法,您可以获得随机排序!
这会使阵列混乱。 如果函数与Array.sort()
那么它通常有两个参数,它们与Array.sort(function(a,b){})
。 返回值小于0表示a
在b
之前,大于0表示a
在b
之后,0表示它们具有相同的顺序。 使用0.5 - Math.random()
意味着您应该随机获得大于或小于0的值。
似乎脚本将通过让compare函数随机返回介于-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'
]
这里sort将根据您传递给它的比较函数执行排序。
在你的情况下,它是:
function() {return 0.5 - Math.random()}
假设你熟悉基于比较的排序,函数应该返回指示左侧值小于负值 , 零 ,如果他们是平等的, 正面的 ,如果左手边值大于右侧值时,多少像C函数strcmp()。
查看您拥有的函数,它将尝试执行随机排序,即尝试对数组进行随机排序。
另外需要注意的是,这种混洗算法并不理想。 这将是自相矛盾的。 因为一切都会随机发生,所以可能会导致a,a。