Javascript 随机但只是在铬
我有这个函数来创建一个随机的数字范围Javascript 随机但只是在铬,javascript,random,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; }); } 它工作完美,但只有在铬。由于某些原因,所有其他浏览器的变化都很小 我这里有一个简单的演示,你可以
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中的数字顺序大多是随机的,但在其他浏览器中没有太多变化,只有少数数字改变了位置,但看起来几乎一样
现在检查一下Chrome和其他浏览器,你会非常清楚地看到它们之间的区别
知道为什么会这样吗
编辑:我还有另一个
randomRange
函数,它在所有浏览器中都可以正常工作,只是更长更难看,请查看差异。这可能是因为在浏览器之间实现了sort()方法。从我到目前为止看到的事实来看,我猜Chrome在进行排序时总是使用非稳定排序(例如quicksort),而其他浏览器在输入大小较小时使用陈旧排序(例如气泡排序)
首先,输入(最初从新数组(..)
创建)已经排序;而函数(){return 0 | Math.random()*max;}
将始终返回一个非负数,这表示a>=b(或a问题已解决!我在Hacker News上找到了a,它现在在所有浏览器中都能完美工作:
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]; });
}
演示:(如果看不到图像,请单击“使用JS运行”)根据
array.sort([compareFunction])
如果compareFunction(a,b)返回0,则将a和b保持不变,并使用
相互尊重,但根据所有不同的
注意:ECMAscript标准不能保证这一点
行为,因此并非所有浏览器(例如Mozilla版本)
至少回到2003年)尊重这一点
你可以试试
.sort(function(){ return Math.random()*2-1; })
你在这里要做的就是返回一个大于、小于或等于0的数字。
正如你在Chrome中看到的那样,数字的顺序大多是随机的
你怎么能看到随机的顺序呢?看看第二个演示,它变得非常清晰。在Chrome中,瓷砖会随机消失,但在Firefox中,瓷砖会随机消失从下到上,没有变化…点击“切换猫”几次,你就会看到不同。在FireFox中,我看到1x1的图片。也许这是一个html/css错误。使用排序功能进行随机洗牌仍然经常会引起很多混乱,所以请注意!@Bondye:确保点击“使用JS运行”在右上角。我认为这是jsbin或placekitten的问题,如果你按下按钮,图像将显示正常。+1,我没有看到那篇MDN文章。这在FF和Chrome中似乎工作正常,但在Opera中仍然存在一些变体问题,但我在HN上找到的代码似乎起到了作用。