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看看有什么不同。

4

3 回答 3

1

根据MDN

array.sort([比较函数])

如果 compareFunction(a, b) 返回 0,则 a 和 b 保持不变,但对所有不同元素进行排序。注意:ECMAscript 标准不保证这种行为,因此并非所有浏览器(例如,至少可以追溯到 2003 年的 Mozilla 版本)都尊重这一点。

你可以试试

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

您在这里要做的只是返回一个大于、小于或等于 0 的数字。

于 2012-09-21T12:50:35.837 回答
0

这可能是由于在资源管理器之间实现了 sort() 方法。从我目前看到的事实来看,我猜Chrome在进行排序时可能总是使用不稳定的排序(例如快速排序),而其他人在输入大小较小时使用过时的排序(例如冒泡排序)。

起初,输入(最初创建自new Array(..))已经排序;并且function(){ return 0|Math.random()*max; }总是会返回一个非负数,这表明a>=b(或a<=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; })改用。

于 2012-09-21T11:01:29.960 回答
0

问题解决了!我在 Hacker News 找到了一个非常好的解决方案,它现在可以在所有浏览器中完美运行:

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

于 2012-09-21T11:10:04.220 回答