将返回涉及 `Math.random()` 的表达式的回调传递给 `sort` 方法有什么作用?

问题描述 投票:0回答:6

我有这个简单的数组:

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
让我困惑......那到底是什么?

(不用说,我从网上下载了它,因为它做了我想要它做的事情......但我只是不明白它。)

javascript sorting random shuffle
6个回答
7
投票

它使用一种排序方法对 URL 列表进行排序,该方法在大约一半的情况下随机返回大于或小于 0 的值。

Math.random()
返回 0 到 1 之间的数字。因此
0.5 - Math.random()
是 -0.5 到 0.5 之间随机确定的值。这些值中约有一半大于零,其中一半小于零。

因此,大约一半的时间比较函数会说第一个对象大于第二个对象,而一半的时间会说相反。

这是一种随机打乱数组的简单方法。正如评论中所指出的,这不是打乱数组的好方法(因为分布不均匀)。

这个问题

有一个已知良好的Fisher-Yates shuffle的有效实现。


1
投票


1
投票
0 表示它更大,返回 0 表示相等。 Math.random() 返回 0 到 1 之间的数字。因此,通过进行减法,您可以得到随机排序!

< 0 to indicate that the first value is smaller, >


1
投票
Array.sort()

一起使用,那么它通常有两个参数进行比较

Array.sort(function(a,b){})
。返回值小于0表示
a
b
之前,大于0表示
a
b
之后,大于0表示它们具有相同的顺序。使用
0.5 - Math.random()
意味着您应该随机获得大于或小于 0 的值。
    


1
投票
compare 函数

随机返回 -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' ]
    

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

就您而言,是:

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

假设您熟悉基于比较的排序,该函数应返回一个

值,表示 左侧 值较小,如果相等则返回 ,如果 左侧 值等于则返回 正值大于右侧值,很像 C 函数 strcmp()。

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

另外一点,这种洗牌算法并不是理想的算法。这将是自相矛盾的。由于一切都会随机发生,因此可能会导致以下情况:a.

© www.soinside.com 2019 - 2024. All rights reserved.