ショボ短歌会

get().sort(function() {
return Math.round(Math.random()) - 0.5;
})
はどういう意味ですか? ソートを
return Math.round(Math.random()) - 0.5;
でするようですが、
ランダムな数字を出してどうやってソートされるのですか?
ソートは文字でか数値ででないのですか?
http://memopad.bitter.jp/w3c/jsref/jsref_sort.html
では
>フォルトで、要素をアルファベットの昇順にソートします。 しかし、数値が正しくソートされません(40が5の前に来ます)。 数値をソートするためには、数を比較する関数を追加しなければなりません。
となっています。
ランダムな数字でソートはできるのですか? 使う意味を教えて下さい。
それから、-0.5をしてるのはどういう意味でしょうか?

A 回答 (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/JavaSc …
ここを参考にしてみてください。
aとbのなぞも解けます。
array.sort(compareFunction);
    • good
    • 0
この回答へのお礼

ありがとうございます。勉強させてもらいます。

お礼日時:2013/07/27 18:59

A No3です。



連投失礼。 以下、補足しておきます。

No3で偏りの例を示しましたが、どうやらブラウザによって偏り方が異なるようです。
多分、sortで使っている計算方法がブラウザによってそれぞれ違っていることによるのではないかと想像します。
それなので、同じスクリプトであっても、結果の偏りの傾向は一律ではないと思われます。

この回答への補足

ありがとうございます。ブラウザも精度に影響するんですね。

補足日時:2013/07/26 16:41
    • good
    • 0

>ランダムな数字を出してどうやってソートされるのですか?


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の出現率は低いなど)

この回答への補足

ありがとうございます。精度が悪いんですね。
いい方法があればいいんですが。

補足日時:2013/07/26 16:41
    • good
    • 0

配列を適当に並び替える処理ですね。


シャッフルとかランダムソートとか呼ばれる処理です。

文字列比較の昇順で並び替え
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 }); // 適当に負数か正数を返す

ただしこの処理ではランダム性に問題があるようで、並び替え結果がかなり偏ってしまいます。
処理性能や簡便性が魅力ではありますが、使用する際はご注意ください。

この回答への補足

http://memopad.bitter.jp/w3c/jsref/jsref_sort.html
では、降順と昇順だけ載っていますが、なぜ適当な順番に並び替えられますか?
>何も比較せずに適当な順番に並び替え
>list.sort(function(a,b){ return Math.random() - 0.5 }); // 適当に負数か正数を返す
の部分がよく理解できないのですが、どうしてこれでランダムな並び替えになりますか?
勉強不足ですみません。疑っているわけではなく、実際にランダムになるんですが、その理由が知りたいんです。

補足日時:2013/07/26 16:41
    • good
    • 0
この回答へのお礼

URL先にも載っていましたが、a-bというのはどこから出てきたものでしょうか?
aとbにはどういった値が入っていますか?
何も入ってないようなのですが、なぜaとbを使いますか?

お礼日時:2013/07/26 16:51

こんにちは。



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つしか指定できないのでしょうか?

補足日時:2013/07/26 16:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!