Home > イヌでもわかるJavaScript講座 お品書き
イヌでもわかるJavaScript講座 お品書き へ戻ります
イヌでもわかるJavaScript講座


Step.77 - ミニロトを予想する


乱数を使って、ミニロトの番号を予想します。
このステップで、トランプカードをシャッフルして、配られたカードをソートするアルゴリズムを学ぶことができます。


Step テーマ
● シャッフル/ソート

実行例


Tatsuya's ミニロト

こんなの でましたぁ〜 →



リスト

Tatsuya's ミニロト<BR><BR>
こんなの でましたぁ〜 →
<script type="text/javascript"><!--
myData = new Array(31);
for (i=0; i<31; i++) myData[i] = i+1;// myData[0〜30] に 1〜31を順次セット
for (i=0; i<500; i++){// 500回 myData の内容をシャッフルする
myA = Math.floor( Math.random() * 31 );// 0〜30 を決める
myB = Math.floor( Math.random() * 31 );// 0〜30 を決める
myBackup = myData[myA];// myData の myA番目とmyB番目の内容を入れ替える
myData[myA] = myData[myB];
myData[myB] = myBackup;
}
myCard = new Array(5);
for (i=0; i<5; i++) myCard[i] = myData[i];// myDataの最初の5個を取り出す
for (i=0; i<4; i++){// 5枚のカードを昇順に並べ替える。
for (j=i+1; j<5; j++){
if (myCard[i] > myCard[j]){// 上の方がでかい?
myBackup = myCard[i];// 入れ替える
myCard[i] = myCard[j];
myCard[j] = myBackup;
}
}
}
for(i=0; i<5; i++){
document.write("[",myCard[i],"]");
if (i < 4) document.write("-");
}
// --></script>


サンプルだけの HTMLは こちらへ

説明


トランプなどのカードゲームは、まず、カードをきらなければ(シャッフル)なりません。
つぎに、カードを配って、それを小さい順に並べ替えたい(ソート)ものです。

今回は、このシャッフルとソートをお勉強してみましょう。

サンプルは、同じ考えかたを持つミニロト番号を予想しています。

トランプやミニロト以外にもタロット占いや麻雀のシーパイ、ハイパイにも使えます。(^^;

では、まず、シャッフルを考えてみましょう。
説明では、1から13までの数字をめちゃくちゃな並びにします。

まず、13個のテーブルを用意します。
myData = new Array(13);

次に、そのテーブルに1から13までを順番にセットします。
for ( i = 0; i < 13; i++ ) myData[ i ] = i+1;
テーブルは0から始まるので、0から12までループします。数字は1から13までをセットしたいので、i+1 とします。

はい、これで、テーブルの中身は、

きれいに、揃っています。(^^;

では、めちゃくちゃにシャッフルしてみましょう。

シャッフルの考え方ですが、要するに、中身をメチャクチャに入れ替えれば、いいわけです。
メチャクチャといえば、乱数ですね。乱数を使いましょう。(^^;
myA = Math.floor( Math.random() * 13 );// 0〜12 を決める
myB = Math.floor( Math.random() * 13 );// 0〜12 を決める
入れ替えるといえば、どこかのデータとどこかのデータです。その、それぞれのテーブル番号を乱数で作ります。

では、myA番目とmyB番目のテーブルの内容を入れ替えます。
myBackup = myData[myA];
myData[myA] = myData[myB];
myData[myB] = myBackup;
わかりましたか?
まず、myA番目の内容を myBackup に待避させておきます。
そして、myB番目の内容をmyA番目にセットします。
そして、myB番目に先ほどのmyA番目にあったデータ myBackup をセットします。
入れ替え終了です。

これで、13個のテーブルのどこかとどこかがシャッフルされました。myAとmyBが偶然同じだったりして。(^^;

では、これを500回くらい繰り返したら、どうなるでしょう。
for (i=0; i<500; i++){
myA = Math.floor( Math.random() * 13 );
myB = Math.floor( Math.random() * 13 );
myBackup = myData[myA];
myData[myA] = myData[myB];
myData[myB] = myBackup;
}

どうやら、めちゃくちゃになったようですね。満足しなかったら、1000回でも10000回でもどうぞ。(^^;


さて、次は並べ替え(ソート)ですね。
トランプで、Aさんに5枚配るとします。myData[0] から myData[4] の5枚を配りましょう。

Aさんには、

が、配られました。これじゃ、見にくいですね。ソートしてみましょう。

一番簡単な方法でやりましょう。

この方法とは、

まず、一番上のカード (myData[0]) を基準とします。
そして残りのカード (myData[1]〜myData[4])の中を順番に見ていって、基準( myData[0] )よりも小さかったら入れ替えます。
これで myData[0] は5枚のカードの中で一番小さな番号になったはずです。

次に基準を一つ下 (myData[1])に移して、残りのカード(myData[2]〜myData[4]) を順番に見て同じことをします。

こんな感じで、基準のカードを枚数−1 つまり、myData[3] までやっていきます。

プログラムにすると、

for (i=0; i<4; i++){
for (j=i+1; j<5; j++){
if (myData[i] > myData[j]){// 上の方がでかい?
myBackup = myData[i];// 入れ替える
myData[i] = myData[j];
myData[j] = myBackup;
}
}
}
分かりますでしょうか?
i が基準の位置。
j が残りのカードの位置を指しています。

「なんだ、シャッフルやソートって、こんなに簡単なのね」と理解できたら、はっきりいって、かなりプログラム知識ができてきましたよ!


 
イヌでもわかるJavaScript講座 お品書き へ戻ります