- ベストアンサー
ランダムな数字でソートする意味とは?
- ソートでランダムな数字を使う意味とは?ランダムな数字を使ったソート方法の説明
- ソートでランダムな数字を使う理由とは?ランダムな数字によるソートの特徴
- ソートでランダムな数字を使った場合の効果とは?ランダムソートのメリットとデメリット
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 ===================== >正または負の値を返すことによって並び替える順序を決めます。 ということは、 0,1,2,3 という数字があれば、 0,1,2,3か 3,2,1,0の2つの並び替えだけできるということですか? >ランダムにソート >シャッフルするイメージ からは、 2,3,1,0や0,3,1,2などもなる感じがしますが、そうではなく、降順・昇順の2つしか指定できないのでしょうか? ===================== 2つの並びになるのではなく、比較対象の2値を並び替える種類が2つ(正と負)あるということです。 ある2値(a,b)を対象にreturn -0.5;と負の値が返ってきた場合は、aの値をbより小さい添え字にします。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort ここを参考にしてみてください。 aとbのなぞも解けます。 array.sort(compareFunction);
その他の回答 (4)
- fujillin
- ベストアンサー率61% (1594/2576)
A No3です。 連投失礼。 以下、補足しておきます。 No3で偏りの例を示しましたが、どうやらブラウザによって偏り方が異なるようです。 多分、sortで使っている計算方法がブラウザによってそれぞれ違っていることによるのではないかと想像します。 それなので、同じスクリプトであっても、結果の偏りの傾向は一律ではないと思われます。
補足
ありがとうございます。ブラウザも精度に影響するんですね。
- fujillin
- ベストアンサー率61% (1594/2576)
>ランダムな数字を出してどうやってソートされるのですか? Math.random()は0~1(1を含まない)乱数を返しますので、値の大小の評価を確率1/2で行なっていると考えられます。 sortのロジックがどのような方法で行なっているのかは知りませんが、構成する各要素の比較の際に大小を半々の確率で評価するということです。 想像するところ、配列のシャッフルの代用として使おうとしているのではないでしょうか? 試しに、 d = [1, 2, 3, 4, 5].sort(function(){ return Math.round(Math.random()) - 0.5; }); として数百回のシャッフル度合いを見てみると、 [ 4, 2, 5, 3, 1 ] [ 4, 5, 1, 2, 3 ] [ 2, 4, 3, 5, 1 ] [ 2, 4, 3, 5, 1 ] [ 1, 4, 5, 2, 3 ] [ 3, 5, 4, 2, 1 ] [ 3, 4, 5, 1, 2 ] ・・・・ ・・・・ のようになりますが、これを集計してみると以下のようになりました。 | 1桁目 | 2桁目 | 3桁目 | 4桁目 | 5桁目 --------------------------------------------------- 値1の出現率 | 0.14 | 0.13 | 0.09 | 0.13 | 0.51 値2の出現率 | 0.20 | 0.22 | 0.16 | 0.32 | 0.10 値3の出現率 | 0.20 | 0.21 | 0.17 | 0.14 | 0.28 値4の出現率 | 0.30 | 0.21 | 0.38 | 0.05 | 0.06 値5の出現率 | 0.16 | 0.23 | 0.20 | 0.36 | 0.05 きれいににシャッフルされていれば出現率はどれも0.2に近くなるはずですが、どうやらだいぶ偏りがあるように思えます。 (百回ずつ分割して集計しましたが、同じ傾向にあるので… 5桁目の1の出現率は高く、5の出現率は低いなど)
補足
ありがとうございます。精度が悪いんですね。 いい方法があればいいんですが。
- Ogre7077
- ベストアンサー率65% (170/258)
配列を適当に並び替える処理ですね。 シャッフルとかランダムソートとか呼ばれる処理です。 文字列比較の昇順で並び替え list.sort(); 数値比較の昇順で並び替え list.sort(function(a,b){ return a-b }); // aが小さければ負数を返す 数値比較の降順で並び替え list.sort(function(a,b){ return -(a-b) }); // aが小さければ正数を返す 何も比較せずに適当な順番に並び替え list.sort(function(a,b){ return Math.random() - 0.5 }); // 適当に負数か正数を返す ただしこの処理ではランダム性に問題があるようで、並び替え結果がかなり偏ってしまいます。 処理性能や簡便性が魅力ではありますが、使用する際はご注意ください。
お礼
URL先にも載っていましたが、a-bというのはどこから出てきたものでしょうか? aとbにはどういった値が入っていますか? 何も入ってないようなのですが、なぜaとbを使いますか?
補足
http://memopad.bitter.jp/w3c/jsref/jsref_sort.html では、降順と昇順だけ載っていますが、なぜ適当な順番に並び替えられますか? >何も比較せずに適当な順番に並び替え >list.sort(function(a,b){ return Math.random() - 0.5 }); // 適当に負数か正数を返す の部分がよく理解できないのですが、どうしてこれでランダムな並び替えになりますか? 勉強不足ですみません。疑っているわけではなく、実際にランダムになるんですが、その理由が知りたいんです。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 sortは正または負の値を返すことによって並び替える順序を決めます。 (0だと上下の関係性が無し) なのでこれを実行すると配列内がランダムにソートされます。 ようするに配列内をシャッフルするイメージです。 0.5引いているのは、戻り値として正の値か負の値が欲しいからです。 Math.roundしているのでランダムの値は0か1が取得されます。 そこから0.5を引けば0.5か-0.5の正か負の値となります。 なので0.5を引いています。
補足
>正または負の値を返すことによって並び替える順序を決めます。 ということは、 0,1,2,3 という数字があれば、 0,1,2,3か 3,2,1,0の2つの並び替えだけできるということですか? >ランダムにソート >シャッフルするイメージ からは、 2,3,1,0や0,3,1,2などもなる感じがしますが、そうではなく、降順・昇順の2つしか指定できないのでしょうか?
お礼
ありがとうございます。勉強させてもらいます。