ランダムな数字でソートする意味とは?

このQ&Aのポイント
  • ソートでランダムな数字を使う意味とは?ランダムな数字を使ったソート方法の説明
  • ソートでランダムな数字を使う理由とは?ランダムな数字によるソートの特徴
  • ソートでランダムな数字を使った場合の効果とは?ランダムソートのメリットとデメリット
回答を見る
  • ベストアンサー

ソートで

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をしてるのはどういう意味でしょうか?

  • 6u711
  • お礼率40% (2/5)

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.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);

6u711
質問者

お礼

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

その他の回答 (4)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.4

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

6u711
質問者

補足

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

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

>ランダムな数字を出してどうやってソートされるのですか? 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の出現率は低いなど)

6u711
質問者

補足

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

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

配列を適当に並び替える処理ですね。 シャッフルとかランダムソートとか呼ばれる処理です。 文字列比較の昇順で並び替え 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 }); // 適当に負数か正数を返す ただしこの処理ではランダム性に問題があるようで、並び替え結果がかなり偏ってしまいます。 処理性能や簡便性が魅力ではありますが、使用する際はご注意ください。

6u711
質問者

お礼

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

6u711
質問者

補足

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

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 sortは正または負の値を返すことによって並び替える順序を決めます。 (0だと上下の関係性が無し) なのでこれを実行すると配列内がランダムにソートされます。 ようするに配列内をシャッフルするイメージです。 0.5引いているのは、戻り値として正の値か負の値が欲しいからです。 Math.roundしているのでランダムの値は0か1が取得されます。 そこから0.5を引けば0.5か-0.5の正か負の値となります。 なので0.5を引いています。

6u711
質問者

補足

>正または負の値を返すことによって並び替える順序を決めます。 ということは、 0,1,2,3 という数字があれば、 0,1,2,3か 3,2,1,0の2つの並び替えだけできるということですか? >ランダムにソート >シャッフルするイメージ からは、 2,3,1,0や0,3,1,2などもなる感じがしますが、そうではなく、降順・昇順の2つしか指定できないのでしょうか?

関連するQ&A

  • javascritp「sort」メソッドについて

    WEB制作初心者、勉強中のものです。 javascritpのsortメソッドについて質問です。 無名関数を使って偶数と奇数を並び替えるコードについてですが、 下記の場合、function(a,b)の引数a,bには、一体どこの数値が入ってるのでしょうか。 var no=[1,2,3,・・・]の中だと思うのですが、、、、a,bが一体何を指すのが 教えていただけないでしょうか? // 『sort』の引数として、使い捨ての関数を作成して利用する var no = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 配列作成 no.sort(function (a, b) { // 偶数を前に、奇数を後ろにソートする if (a % 2 == 0 && b % 2 != 0) return -1; if (a % 2 != 0 && b % 2 == 0) return 1; return 0; }); alert(no); // 『2, 4, 6, 8, 10, 1, 3, 5, 7, 9』と表示 よろしくお願い致します。

  • TreeMapで昇順ソートされない

    TreeMapで昇順ソートをさせようと思って以下のサンプルプログラムを作成しました。 ところが結果は予想に反して108,28,3,608,8 というようにランダムに数値が表示されました。 put するときに mapRecordNumKind.put(108, "あ"); というようにkeyをintにしてみたところ昇順に表示させることができました。 インターネットで見たサンプルではkeyの数値をStringでputしていたのですが そもそも参照したページが誤っていてTreeMapはString型の数値では昇順ソートされないもの なのでしょうか。   TreeMap<String,String> mapRecordNumKind = new TreeMap<String,String>();   mapRecordNumKind.put("108", "あ");   mapRecordNumKind.put("3", "い");   mapRecordNumKind.put("8", "う");   mapRecordNumKind.put("28", "え");   mapRecordNumKind.put("608", "お");   Iterator<String> its = mapRecordNumKind.keySet().iterator();      while(its.hasNext()) {     String key = its.next();     System.out.println(key);   }

    • ベストアンサー
    • Java
  • 配列のソートがしたい

    sort関数等調べたのですがうまくできません。 やりたいことは http://q.hatena.ne.jp/1155090363 ↑で見つけた事とそっくりなのですが・・・。 ------------------------------------------- arrItem[n] という配列の一つの要素の中に、 タブで区切られた10個程のデータが入っています。 arrItem[0] = "5 ^ 店名5 ^ 品名5 ^ 価格5 ^ 割引額5 ^・・・^ 備考5" arrItem[1] = "2 ^ 店名2 ^ 品名2 ^ 価格2 ^ 割引額2 ^・・・^ 備考2" arrItem[2] = "11 ^ 店名9 ^ 品名9 ^ 価格9 ^ 割引額9 ^・・・^ 備考9" 一列目はSEQ番号でユニークですが、順番が並んでいません。 この配列をSEQ番号で並べ替えたいのですが、 sortだと文字列比較のためか桁数の違う数字の並べ替えが 上手くできません。数値としてのソート方法 が分かる方いらっしゃいましたらご教授願います。 もし可能なら、1列目を数値降順にしたり昇順にしたり、 また2列目を五十音順にソートしたり、 また4列目を価格の安い順にソートしたり と応用も可能ならばご教授願いたいです。 宜しくお願い致します。

  • javascriptとhtmlでわからないとこが・・

    ボタンを押すと1~9までの数字が出てくるってので 繰り返し押せるようにしたいのですが、 ボタンを押すと文字だけになり再度ボタンを押すにはブラウザの戻るを 押すことになってしまうんですけどどうしたらいいでしょうか? <html> <head> <title>test</title> <script type = "text/javascript"> function damage(){ var a=Math.random()*10; a=Math.round(a); document.write(a); } </script> </head> <body> <form> <input type ="button"name="abc"value="1~10"onclick=damage()> </form> </body> </html> 出来れば、 出てきた数値が10を超えると画像を切り替える方法も教えてもらえるとありがたいです。 よろしくお願いします。

  • 昇順ソート

    sort.txtから読み込んだ値を 昇順でソートして出力するにはどうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int strcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; int length; char s[256], s2[256]; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s, 256, fin) != NULL) { /* 要素数を求める */ length = sizeof(s) / 256; /* 昇順でソート */ qsort(s, length, 256, strcmp_asc); /* memset(s2, NULL, sizeof(s2)); for (i = 0; i < length; i++) { } */ fprintf(fout,"%s\n",s2); } fclose(fin); fclose(fout); return 0; } int strcmp_asc(const void *sa, const void *sb) { return strcmp((char *)sa, (char *)sb); } sort.txt 50 45 35 25 15 10 5 1 32 46 8 7 9 19 18 14 16 13 12 17 11 20 40 30 31 3 2 37 38 36 33 39 34 49 47 48 4 6 44 42 43 41 21 22 26 24 28 29 27 23

  • 1フレームにActionを設定したときの止め方

    ただ今flash勉強中の初心者です。検索したり本を調べたりしても根本が理解できていないためか、解答策が見つからず困っています。 自分で作ったものではないのですが、1フレーム目にActionを書いています。動きとしては、テレビの砂嵐のような画面に、二種類の文字がランダムに出て、ラインもランダムに出てくるという感じです。以下のscriptだと永遠と続くのですが、5秒ぐらいランダムに文字とラインが出て、その後砂嵐の画面だけにして止めたいのですが、どうしたら良いかわかりません。 使用しているソフトはFlash8、MacOSX10.4です。 import flash.display.BitmapData; var tv_noise:BitmapData = new BitmapData(Stage.width,Sage.height,true); _root.attachBitmap(tv_noise,20); _root.attachMovie("text1","text_1",3); _root["text_1"].scale = 350; _root["text_1"].onEnterFrame = random_me; _root.attachMovie("text2","text_2",2); _root["text_2"].scale = 350; _root["text_2"].onEnterFrame = random_me; _root.attachMovie("line","line_1",1); _root["line_1"]._y = Stage.height/2; _root["line_1"]._alpha = 40; _root["line_1"].onEnterFrame = scale_me; function random_me():Void{ this._x = 10+Math.round(Math.random()*Stage.width); this._y = 10+Math.round(Math.random()*Stage.height); this._xscale = this._yscale = Math.round(Math.ramdom() *this.scale); this._alpha = 10+Math.round(Math.random()*100); } function scrach_me():Void{ this._x = 10+Math.round(Math.random()*Stage.width); tv_noise.noise(Math.round(Math.random()*100000),80,170,8,true); } 宜しくお願いします。

    • ベストアンサー
    • Flash
  • jqfloat.jsを複数の画像に適用したい

    javascriptで7枚の画像をブラウザの中にランダム配置で表示させ、 さらにjQueryのjqfloat.jsで画像をふわふわ動かす、というものを作っています。 ランダム配置まではうまくいったのですが jqfloatが7枚のうち1枚にしか適用されず困っております。(最後のid='fuwa'のところ) jsの勉強を始めたばかりでスクリプトの書き方が変だったりするかもしれませんが… どなたか対処法を教えていただけませんでしょうか。 どうぞよろしくお願い致します! <script type="text/javascript"><!-- $(document).ready(function() { $('#fuwa').jqFloat({ width: 50, height: 50, speed: 2500 }); }); var images = [ {img : "1.png" , url : "http://1.com"}, {img : "2.png" , url : "http://2.com"}, {img : "3.png" , url : "http://3.com"}, {img : "4.png" , url : "http://4.com"}, {img : "5.png" , url : "http://5.com"}, {img : "6.png" , url : "http://6.com"}, {img : "7.png" , url : "http://7.com"} ]; images.sort(function(){return Math.random() - Math.random();}); function getBrowserWidth ( ) { if ( window.innerWidth ) { return window.innerWidth; } else if ( document.documentElement && document.documentElement.clientWidth != 0 ) { return document.documentElement.clientWidth; } else if ( document.body ) { return document.body.clientWidth; } return 0; } function getBrowserHeight ( ) { if ( window.inneHeight ) { return window.innerHeight; } else if ( document.documentElement && document.documentElement.clientHeight != 0 ) { return document.documentElement.clientHeight; } else if ( document.body ) { return document.body.clientHeight; } return 0; } Imgn=7; for (i=0; i < Imgn; i++){ xpx = 50+Math.floor(Math.random() * (window.innerWidth -280)) + 1; ypx = 30+Math.floor(Math.random() * (window.innerHeight -300)) + 1; thumbs="<div style='position:absolute;left:"+ xpx +"px;top:"+ ypx +"px;' id='fuwa'><a href='"+images[i].url+"'><img src='"+images[i].img+"'></a></div>"; document.write(thumbs); } </script>

  • 0だけは5回中1回表示し、他は条件なしのランダムで

    0~20の数字があります。 1つの数字だけを表示させます。 0以外の全ての数字はランダムに表示します。 0は5回中1回表示させるようにしたいです。 fff(0); function fff(b){ if(b%5 == 0){ a=0; }else{ a = Math.floor(Math.random() * 20) + 1; } alert(a); b++; setTimeout('fff(' + b + ')', 2000); } では1~20までの数字がランダムに表示されますが、 0が表示されるタイミングが決まってしまいます。 もっと上手にするためにはどうしたらよいのでしょうか。

  • php多次元配列のソート(usort)について

    http://www.php.net/manual/ja/function.usort.php にusortの例として下記がありますが、それについて質問です。 -------------例文------------- <?php function cmp($a, $b) { return strcmp($a["fruit"], $b["fruit"]); } $fruits[0]["fruit"] = "lemons"; $fruits[1]["fruit"] = "apples"; $fruits[2]["fruit"] = "grapes"; usort($fruits, "cmp"); while (list($key, $value) = each($fruits)) { echo "\$fruits[$key]: " . $value["fruit"] . "\n"; } ?> -------------結果------------- $fruits[0]: apples $fruits[1]: grapes $fruits[2]: lemons 上の例は、usortで$fruitsという配列をソートしています。 そのとき、cmpという関数を条件にしている、というのは分かりますが、 なぜcmpを条件にすることでアルファベットの昇順になるのでしょうか? strcmp($a["fruit"], $b["fruit"]);にたとえばlemonsとかapplesが入って strcmpによって比較がされて、結果として1や-1が返されて その結果、たとえばusort($fruits, "-1")や、usort($fruits, "1") となったとします。それがなぜ結果として昇順になるのでしょうか?

    • ベストアンサー
    • PHP
  • 配列の日付ソート処理2

    先ほど下記のような質問をしたのですが、、、 最初の配列の添え字を取得したい場合はどのようにしたらいいのでしょうか?? ksort($up_date, "cmp"); while (list ($key, $value) = each ($up_date)) { echo "$key: $value\n"; } function cmp ($a, $b) { if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } としても、日付がうまく昇順されません。 この方法では駄目なのでしょうか?? ******************************************* 配列に下記のような日付が入ってます。 $array[0]=2004-11-01 14:20:10.412761+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-30 20:25:39.622259+09; これをもっとも新しい日付の順序にしたいのですが、 これはやはり、バブルソートなどを作成する必要がでてきますでしょうか??? *********************************************

    • ベストアンサー
    • PHP