我有这个简单的数组:
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的有效实现。
< 0 to indicate that the first value is smaller, >
Array.sort()
一起使用,那么它通常有两个参数进行比较
Array.sort(function(a,b){})
。返回值小于0表示a
在b
之前,大于0表示a
在b
之后,大于0表示它们具有相同的顺序。使用 0.5 - Math.random()
意味着您应该随机获得大于或小于 0 的值。随机返回 -0.5 和 +0.5 之间的值随机地shuffle这个数组
它还生成一个长度为 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'
]
就您而言,是:
function() {return 0.5 - Math.random()}
假设您熟悉基于比较的排序,该函数应返回一个
负 值,表示 左侧 值较小,如果相等则返回 零,如果 左侧 值等于则返回 正值大于右侧值,很像 C 函数 strcmp()。
查看您拥有的函数,它将尝试执行随机排序,即尝试对数组进行洗牌。另外一点,这种洗牌算法并不是理想的算法。这将是自相矛盾的。由于一切都会随机发生,因此可能会导致以下情况:a.