随机但只是在Chrome中

时间:2012-09-21 10:35:42

标签: javascript random

我有这个功能来创建一个随机范围的数字。

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以查看差异。

3 个答案:

答案 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运行”)