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を確認すると、違いがはっきりとわかります。

なぜこれが起こっているのですか?

編集:私はすべてのブラウザーで正常に動作する別の関数を持っています。それは長くて醜いだけです。http :randomRange //jsbin.com/iyalax/4/edit をチェックして違いを確認してください。

4

3 に答える 3

1

MDNによると、

array.sort([compareFunction])

compareFunction(a, b) が 0 を返す場合、a と b は互いに変更されませんが、すべての異なる要素に関して並べ替えられます。注: ECMAscript 標準はこの動作を保証していないため、すべてのブラウザー (たとえば、少なくとも 2003 年までさかのぼる Mozilla バージョン) がこれを尊重しているわけではありません。

あなたが試すことができます

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

ここでやろうとしているのは、0 以上、0 以下、または 0 に等しい数値を返すことだけです。

于 2012-09-21T12:50:35.837 に答える
0

これは、エクスプローラ間の sort() メソッドの実装が原因である可能性があります。これまで見てきた事実から、Chrome はソートを行うときに常に非安定ソート (クイックソートなど) を使用し、他の 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 (画像が表示されない場合は [Run with JS] をクリックしてください)

于 2012-09-21T11:10:04.220 に答える