1
var array = [3,9,23,76,1,54,21,12,0,9,2];
var shuffled = array.sort(function() {return 0.5 - Math.random()});
console.log(shuffled);  

私は結果を知っており、またそれらに満足しています。

上記のコードは、配列の要素のシャッフルされた順序を返します。

なぜそれがその出力をもたらすのか私は困惑しています。

内部の関数のポイントは何.sortですか?それは出力にどのように貢献しますか?

4

3 に答える 3

1

関数は実際には2つの引数を取ります。これは、配列からの2つの項目です。目的は、これらの要素を比較して数値を返すことです。
数値が正の場合、2番目の項目は最初の項目の前にある必要があります。
数値が0または負の場合、2番目の項目は最初の項目の後にある必要があります。

[0,1].sort(function(a,b){return  1;}); // [1, 0], reverses order
[0,1].sort(function(a,b){return  0;}); // [0, 1], does nothing
[0,1].sort(function(a,b){return -1;}); // [0, 1], does nothing 

上記の例のいずれの場合も、a === 0およびb === 1


ステップバイステップ出力用に編集

昇順の並べ替えで何が起こっているかを段階的に確認するために[1,3,2,4,4,0]、各段階で何が起こっているかを正確にログに記録する関数を作成できます。

arr = [1,3,2,4,4,0];
arr.sort(function(a,b){ // ascending order sort
    var result = a-b,
    str = '';
    if(result > 0) str = 'so swapping';
    else if(result === 0) str = 'so ignoring'
    else str = 'so continuing';
    console.log('with [ '+arr.join(', ')+' ]','comparing',a,'to',b,'resulting in',result, str);
    return result;
});
console.log('resulting in [ '+arr.join(', ')+' ]');

どの出力

with [ 1, 3, 2, 4, 4, 0 ] comparing 1 to 3 resulting in -2 so continuing
with [ 1, 3, 2, 4, 4, 0 ] comparing 3 to 2 resulting in 1 so swapping
with [ 1, 3, 3, 4, 4, 0 ] comparing 1 to 2 resulting in -1 so continuing
with [ 1, 2, 3, 4, 4, 0 ] comparing 3 to 4 resulting in -1 so continuing
with [ 1, 2, 3, 4, 4, 0 ] comparing 4 to 4 resulting in 0 so ignoring
with [ 1, 2, 3, 4, 4, 0 ] comparing 4 to 0 resulting in 4 so swapping
with [ 1, 2, 3, 4, 4, 4 ] comparing 4 to 0 resulting in 4 so swapping
with [ 1, 2, 3, 4, 4, 4 ] comparing 3 to 0 resulting in 3 so swapping
with [ 1, 2, 3, 3, 4, 4 ] comparing 2 to 0 resulting in 2 so swapping
with [ 1, 2, 2, 3, 4, 4 ] comparing 1 to 0 resulting in 1 so swapping
resulting in [ 0, 1, 2, 3, 4, 4 ]

完全を期すために、元の質問のシャッフルアルゴリズムの確率テーブル(各インデックスの500,000回の試行に基づいて推定)、Xはインデックスを開始しています

 x     0     1     2     3     4     5     6     7     8     9    10
 0 |  8.0,  8.0,  6.2,  6.6,  9.2, 10.8,  9.3,  6.6,  6.2,  9.7, 18.8
 1 |  4.5,  4.6,  7.8, 12.2, 16.9, 12.9, 11.4, 10.7,  8.7,  6.1,  3.6
 2 | 15.5, 15.5, 10.3,  5.9,  3.7,  3.8,  5.7,  8.3, 10.6, 11.7,  8.5
 3 | 10.4, 10.3, 13.4, 10.2,  7.0,  6.5,  7.8,  9.4,  9.7,  8.8,  6.0
 4 |  6.4,  6.3, 10.7, 15.4, 11.4,  9.5,  9.6,  9.9,  8.9,  6.9,  4.4
 5 | 16.1, 16.1, 10.9,  7.7,  7.4,  7.6,  6.2,  4.4,  4.1,  6.5, 12.5
 6 |  4.7,  4.7,  7.1,  9.7, 12.6, 16.3, 13.6, 11.9,  9.2,  6.1,  3.6
 7 |  6.0,  6.0,  7.7,  8.9,  9.4, 10.9, 14.0, 13.6, 11.2,  7.4,  4.3
 8 |  8.4,  8.3,  9.1,  8.6,  7.3,  6.7,  8.2, 11.6, 13.8, 10.8,  6.7
 9 | 11.5, 11.4, 10.1,  7.6,  5.0,  3.7,  4.2,  6.7, 10.9, 15.8, 12.6
10 |  8.0,  8.1,  6.2,  6.6,  9.2, 10.9,  9.2,  6.6,  6.1,  9.8, 18.8
于 2012-09-16T18:39:45.777 に答える
0

並べ替えの目的は、リスト内のアイテムをランダムに配置することだと思います。sort()メソッドの無名関数は、正または負の値を返します。これは、まさにコールバックが行うことになっていることです。

ソートコールバックは、2つのアイテムを比較するために使用され、より小さい、等しい、およびより大きい場合、それぞれ-1、0、または-1のいずれかを返すことになっています。

比較関数は、個別の呼び出しで同じ2つのオブジェクトに対して異なる値を返す可能性があるため、これがランダム化の良い方法であるかどうかについては、おそらく別の議論があります。

于 2012-09-16T18:30:55.807 に答える
0

の引数sortは並べ替えコールバックです。これは、並べ替えられた2つの値を引数として受け取り、比較される最初の値が2番目よりも小さいか、等しいか、大きいかに応じて、負、0、または正を返す関数です。

Math.random特定の例では、このコールバックは比較された実際の値を完全に無視し、代わりに、範囲0 .. 1の値を返し、それを0.5から減算して、結果の範囲を-0.5..0.5に変更する乱数を生成します。これにより、ソートは、ある値が別の値よりも小さいか大きいとランダムに想定し、「実際の」条件でソートするのではなく、ランダムにシャッフルされたリストを生成することになります。

于 2012-09-16T19:15:24.720 に答える