【问题标题】:Random but just in Chrome随机但仅在 Chrome 中
【发布时间】:2012-09-13 18:42:06
【问题描述】:

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

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

【问题讨论】:

  • As you can see the order of numbers in Chrome is mostly random 你怎么能看到随机顺序? Read this if you want to know more about "random".
  • 查看第二个演示,它变得非常清晰。这些图块在 Chrome 中非常随机地消失,但在 Firefox 中它们大多从下到上消失,没有变化……点击“切换猫”几次,你会看到不同。
  • 在 FireFox 中我看到 1x1 图片。也许这是一个 html/css 错误
  • 使用排序函数进行随机洗牌仍然经常会引起很多混乱,所以要小心!
  • @Bondye:确保点击右上角的“Run with JS”。我认为这是 jsbin 或 placekitten 的问题,如果您按下按钮图像会显示正常。

标签: javascript random


【解决方案1】:

根据MDN

array.sort([compareFunction])

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

你可以试试

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

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

【讨论】:

  • +1,我没有看到 MDN 文章。这似乎在 FF 和 Chrome 中运行良好,但在 Opera 中仍然存在一些变化问题,但我在 HN 上找到的代码似乎可以解决问题。
【解决方案2】:

问题解决了!我在 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]; });
}

Demo:http://jsbin.com/iyalax/9/edit(看不到图片的点击“Run with JS”)

【讨论】:

    【解决方案3】:

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

    首先,输入(最初从new Array(..)创建)已经排序;并且function(){ return 0|Math.random()*max; } 将始终返回非负数,这表明a>=b(或a

    在 IE 中:[1,2,3].sort( function(){return 1} ) 发出 [1,2,3];但在 Chrome 中,结果是[3,2,1],所以我相信这可能是真正的因素。

    因此,作为结论,我想改用.sort(function(){ return (0|Math.random()*max)-max/2; })

    【讨论】:

      猜你喜欢
      • 2013-07-20
      • 2021-08-24
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 2016-11-27
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多