2012-09-21 42 views
2

我有这个函数来创建一个随机范围的数字。随机,但只是在铬

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

'正如你所看到的Chrome中的数字顺序大多是随机的,你怎么看到随机顺序? [如果你想了解更多关于“随机”的内容,请阅读本文。](http://www.random.org/) –

+0

查看第二个演示,它变得非常清晰。 Chrome在Chrome中非常随机地消失,但在Firefox中它们大部分从底部到顶部消失,没有变化...几次单击“切换猫”,您将看到不同之处。 – elclanrs

+0

在FireFox中,我看到1x1张照片。也许这是一个html/css错误 –

回答

0

问题解决了!我发现了一个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运行”,如果你不能看到图像)

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; })代替。

1

根据MDN

的Array.sort([的compareFunction])

如果的compareFunction(A,b)返回0,离开a和b不变d与 相互尊重,但相对于所有不同的 元素进行排序。注意:ECMAscript标准并不保证这种行为,因此并非所有浏览器(例如约会至少2003年的 的Mozilla版本)都尊重这一点。

您可以尝试

.sort(function(){ return Math.random()*2-1; }) 

所有你想在这里做的是返回一个数字,或者是大于,小于或等于0。

+0

+1,我没有抓住该MDN文章。这在FF和Chrome中似乎可以正常工作,但在Opera中仍然存在一些变化问题,但我在HN上找到的代码似乎有诀窍。 – elclanrs

相关问题