我有这个功能来创建一个随机范围的数字。
function randomRange(min, max) {
return (new Array(++max-min))
.join('.').split('.')
.map(function(v,i){ return min+i; })
.sort(function(){ return 0|Math.random()*max; });
}
它非常完美,但仅适用于Chrome。所有其他浏览器由于某种原因变化很小......
我在这里有一个简单的演示,因此您可以看到差异http://jsfiddle.net/elclanrs/zZRda/。
正如您所看到的,Chrome中的数字顺序大多是随机的,但在其他浏览器中,变化不大,只有少数数字会发生变化,但看起来几乎相同。
现在在Chrome和其他浏览器中查看http://jsbin.com/iyalax/3/edit,您就会非常清楚地看到差异。
为什么会发生这种情况?
修改:我还有另一个randomRange
功能,可以在所有浏览器中正常使用,只需更长时间,更加丑陋,请查看http://jsbin.com/iyalax/4/edit以查看差异。
答案 0 :(得分:1)
根据MDN,
的Array.sort([的compareFunction])
如果compareFunction(a,b)返回0,则保持a和b不变 相互尊重,但相对于所有不同的排序 元素。注意:ECMAscript标准不保证这一点 行为,因而并非所有浏览器(例如Mozilla版本约会 至少回到2003年)尊重这一点。
你可以尝试
.sort(function(){ return Math.random()*2-1; })
你要做的就是返回一个更大,小于或等于0的数字。
答案 1 :(得分:0)
这可能是由于探索者之间实现了sort()方法。从我到目前为止看到的事实来看,我想Chrome可能总是在进行排序时使用非稳定排序(例如快速排序),而其他人在输入大小较小时使用陈旧排序(例如冒泡排序)。
首先,输入(最初从new Array(..)
创建)已经排序;并且function(){ return 0|Math.random()*max; }
将始终返回非负数,这表示a> = b(或者< = b,我不确定)?所以,当我试图挖掘它时,我发现Chrome和IE(版本9)之间的排序行为是不同的。
在IE中:[1,2,3].sort( function(){return 1} )
发出[1,2,3]
;但在Chrome中,结果是[3,2,1]
,所以我相信这可能是真正的因素。
因此,作为结论,我想改用.sort(function(){ return (0|Math.random()*max)-max/2; })
。
答案 2 :(得分:0)
问题解决了!我在Hacker News找到了pretty sweet solution,它现在在所有浏览器中都很完美:
function randomRange(min, max) {
return (new Array(++max-min))
.join('.').split('.')
.map(function(v,i){ return min+i; })
.map(function(v) { return [Math.random(), v]; })
.sort().map(function(v) { return v[1]; });
}
演示: http://jsbin.com/iyalax/9/edit(如果看不到图像,请点击“使用JS运行”)