「ものづくり:make」を楽しみながら学ぶ人へ向けた独習サポートサイト。

micro:bit Lab.【マイクロビット】

micro:bit Lab.では、micro:bit【マイクロビット】に関する情報を紹介しています。

数字をシャッフルする
付録2-36

【実用】ビンゴマシン

2019-10-212019-10-21

決められた範囲の数字(1~10など)をシャッフルして、先頭から順番に表示するビンゴマシンです。

1.内容

決められた範囲の数字(サンプルプログラムでは1~10)をシャッフルして、先頭から順番に表示する簡易的なビンゴマシンです。数字の最大値(サンプルプログラムでは10)はプログラム中で指定します。

このサンプルプログラムは、プログラムでシャッフルする方法(2種類)を紹介したものです。実際に、ビンゴマシンとして使用するには、数字の表示方法に工夫が必要です。例えば「ボタンAを押すごとに数字を先頭から一つずつ順番に表示する」などです。

2.このプログラムの動作に必要なもの

このプログラムは、micro:bit本体のみで動作します。

  • micro:bit本体
  • パソコン(*1)
  • USBケーブル(*1)

(*1):パソコン・USBケーブルは、プログラミングに必要なものです。

3.サンプルプログラム(ブロック)

サンプルプログラム(ブロック)です。

最初だけ実行されるプログラム

変数の初期化を行った後、ビンゴの数字をシャッフルする関数を呼び出しています。

図3-1.最初だけ実行されるプログラム
図3-1.最初だけ実行されるプログラム

関数:ビンゴの初期化

ビンゴの数字という配列に、1から最大値で指定された数まで格納します。その後、配列に保管された数字を入れ換えながらシャッフルします。シャッフルの方法については「5.解説」で紹介します。

図3-2.関数:ビンゴの初期化
図3-2.関数:ビンゴの初期化

関数:ビンゴの初期化_簡易版

関数「ビンゴの初期化」と同様に、配列に保管した数字をシャッフルします。この関数は、乱数で入替元と入替先の添え字(配列の番号)を求めた後、各々に保管された数字を入れ替えてシャッフルするものです。十分にシャッフルされるように、このプログラムでは最大値を二乗した回数分、入れ替えを繰り返しています。この方法は、理解しやすいのですが、処理に無駄が多くなります。

図3-3.関数:ビンゴの初期化_簡易版
図3-3.関数:ビンゴの初期化_簡易版

4.サンプルプログラム(JavaScript)

サンプルプログラム(JavaScript)です。

表4-1.サンプルプログラム(JavaScript)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function ビンゴの初期化 (最大値: number) {
    for (let カウンター = 0; カウンター <= 最大値; カウンター++) {
        ビンゴの数字[カウンター] = カウンター + 1
    }
    for (let 入替元 = 0; 入替元 <= 最大値 - 2; 入替元++) {
        入替先 = Math.randomRange(入替元, 最大値 - 1)
        入替元の数字 = ビンゴの数字[入替元]
        ビンゴの数字[入替元] = ビンゴの数字[入替先]
        ビンゴの数字[入替先] = 入替元の数字
    }
}
function ビンゴの初期化_簡易版 (最大値: number) {
    for (let カウンター = 0; カウンター <= 最大値; カウンター++) {
        ビンゴの数字[カウンター] = カウンター + 1
    }
    for (let i = 0; i < 最大値 * 最大値; i++) {
        入替元 = Math.randomRange(0, 最大値 - 1)
        入替先 = Math.randomRange(0, 最大値 - 1)
        入替元の数字 = ビンゴの数字[入替元]
        ビンゴの数字[入替元] = ビンゴの数字[入替先]
        ビンゴの数字[入替先] = 入替元の数字
    }
}
let 入替元 = 0
let 入替元の数字 = 0
let 入替先 = 0
let ビンゴの数字: number[] = []
ビンゴの数字 = []
let 数字の最大値 = 10
ビンゴの初期化(数字の最大値)
for (let カウンター = 0; カウンター <= 数字の最大値 - 1; カウンター++) {
    basic.showNumber(ビンゴの数字[カウンター])
}

5.解説

関数「ビンゴの初期化」で行われているシャッフル方法について図解します。

関数「ビンゴの初期化_簡易版」では、入替元と入替先の添え字(配列の番号)を求めるという方法でシャッフルします。十分にシャッフルするために、このプログラムでは最大値を二乗した回数分、入れ替えを繰り返しています。この方法は、理解しやすいのですが、処理に無駄が多くなります。最大値が10の場合、繰り返しの回数は100回となります。

一方、関数「ビンゴの初期化」では、繰り返し回数が最大値-1(最大値より一つ少ない)回数でシャッフルすることができます。その方法は、図5-1のようになります。プログラムと比較しながら、動きを考えてみましょう。

図5-1.効率的なシャッフル
図5-1.効率的なシャッフル
この記事を読んだ人は、こんな記事にも興味があります。
スポンサーリンク
TOPへ移動
目次へ移動