プログラミングの乱数とは?Scratchのサイコロでわかるランダムの仕組み
プログラミングにおける「乱数」とは、ランダムに選ばれる数値のことです。
Scratchでは「1から6までの乱数」というブロックを使うことで、サイコロを振るように1〜6の整数をランダムに選べます。
ただし、ランダムだからといって毎回必ず違う数が出るとは限らず、同じ数字が連続することもあります。
また、「6回振れば1〜6が1回ずつ綺麗に出る」という仕組みでもありません。
この記事では、Scratchを使ってクリックするたびに出目が変わるサイコロを作ります。
さらに20回分の結果を記録し、「どんな数が選ばれるのか」「選んだ数をどこに保存するのか」「出目に偏りがあっても良いのか」を実際に確かめていきましょう。
Scratchの基本操作がわかる小学生・中学生はもちろん、学習をサポートする保護者の方にもおすすめの内容です。
プログラミングにおける乱数の意味

決めた範囲から数を選ぶ仕組み
ゲームで敵の出現場所をランダムに変えたり、クイズの出題順をシャッフルしたりするときに乱数が活躍します。
作り手がすべての結果を順番通りに決めておく代わりに、プログラムがその都度数を選び、その結果に応じて動きを変化させます。
例えば、1〜6を選ぶ乱数の場合、候補となるのは「1・2・3・4・5・6」の6通りです。
どの範囲から選ぶかはプログラムを作る人が決めますが、その中から次にどの数が選ばれるかは乱数の仕組みに委ねられます。
| 乱数を使う場面 | 数に対応させるもの |
|---|---|
| サイコロ | 1〜6の出目 |
| じゃんけん | グー・チョキ・パーの3種類 |
| 敵が現れる場所 | 画面上の位置(座標) |
| アイテムが出るまでの時間 | 待ち時間(秒数) |
乱数ブロックの役割は、あくまで「数を選ぶこと」です。
「6が出たら得点を増やす」「選ばれた位置に敵を出す」といった具体的なアクションは、別の命令ブロックを組み合わせて作っていきます。
毎回違う数になることとの違い
本物のサイコロを振ったとき、たまたま連続して「3」が出ることがあるように、プログラムの乱数でも前回と同じ数が選ばれることは珍しくありません。
例えば「3、3、6」と続いたとしても、1〜6の中から選んだ結果としてごく自然な現象です。同じ数字が続いたからといって、プログラムが間違っているわけではありません。
一方で、「一度引いたクジを箱に戻さない福引」のような仕組みでは、引くたびに残りの候補が減っていきます。
「毎回1〜6から選び直すサイコロ」と「一度出た候補を減らしていくクジ引き」では、プログラミングの組み方が根本から異なります。
まずは基本となる、重複もあり得るサイコロの仕組みから作ってみましょう。
Scratchの乱数ブロックと変数の役割

「1から6までの乱数」で選ばれる数
Scratchの「演算」カテゴリーには「1から10までの乱数」というブロックが用意されています。
この右側の数値を「6」に変えるだけで、サイコロの出目として活用できます。今回のように両端に整数の「1」と「6」を入力した場合、1と6を含めた6つの整数の中から数が選ばれます。Scratch公式ヘルプの乱数ブロック
範囲を「1〜5」にすると6が出なくなり、「0〜6」にすると0も出るようになってしまいます。サイコロを作る際は、入力した2つの数値をしっかり確認しましょう。
この乱数ブロックは、数値を指定する丸い枠にはめ込んで使用します。例えば「出目を○にする」の○の部分にはめ込むことで、選ばれた数を「出目」に記録できます。
一度選んだ数を保存する「変数」
プログラムの中で選んだ数に名前をつけて保存し、後から自由に使えるようにする仕組みを「変数」と呼びます。
今回は「出目」という名前の変数を作成します。
サイコロを振って出た数を一度「出目」という変数に保存しておけば、画面に数値を表示するときも、アタリかどうかを判定するときも、同じ数を使って処理できます。
ここで注意したいのは、「乱数ブロックを使うたびに、新しい数が選び直される」という点です。出目を決めた後、画面表示用として別の場所で再び乱数ブロックを使ってしまうと、「表示される数」と「判定に使われる数」が食い違ってしまう原因になります。
「乱数は1回だけ引いて変数に保存し、必要な場所ではその変数を使う」というのが基本の考え方です。
変数の基礎をあらかじめ確認しておきたい方は、プログラミングの「変数」とは?も併せてご覧ください。
Scratchで作るサイコロの手順

まずは、ネコをクリックするとランダムな数字を吹き出しで喋るシンプルなプログラムを作ります。
サイコロのイラストを用意したりアニメーションをつけたりするのは、仕組みがしっかり動くのを確認してからで構いません。
以下のコード表記は、Scratchのブロックの組み合わせ方をテキストで表したものです。そのままコピー&ペーストして動くものではないため、Scratchのエディター画面で同じブロックを探して組み立ててください。画面の基本的な使い方から確認したい方は、Scratchの始め方の記事を参考にしてください。
手順1:編集画面と「出目」の準備
Scratchの作成画面を開き、画面上部の言語設定を日本語にします。
最初から配置されているネコをそのまま使うため、新しいキャラクターを追加する必要はありません。なお、Scratchではキャラクターなどのオブジェクトを「スプライト」と呼びます。
ネコのスプライトを選択した状態で、「変数」カテゴリーから「変数を作る」をクリックします。

変数名を「出目」とし、設定は「すべてのスプライト用」を選んでOKを押します。作成後、「出目」の左側にあるチェックボックスを入れて、ステージ(ゲーム画面)上に現在の値が表示される状態にしておきましょう。
変数名を「出目」にし、「すべてのスプライト用」を選んで作成します。
手順2:緑の旗で始める準備
「イベント」にある「緑の旗が押されたとき」ブロックに、「変数」や「見た目」のブロックを以下のように繋げます。

最初に出目を「0」にしているのは、「まだサイコロを振っていない状態」をわかりやすく区別するための準備です。サイコロの候補に0を含めているわけではありません。
緑の旗をクリックしたときに出目が0になり、ネコが吹き出しで案内を喋るか確認してください。新しく試す前に、いつでも最初の状態へリセットできるようにしておくことが大切です。
手順3:クリックで出目を決める命令
先ほどのコードとは別に、「このスプライトが押されたとき」から始まる新しいプログラムを作成します。

「出目を○にする」の枠の中に、「演算」の乱数ブロックをはめ込みます。
そして「○と言う」の枠には、「変数」カテゴリーにある丸い「出目」ブロックを入れてください。枠の中にキーボードで直接「出目」と文字を入力してしまうと、変数の中身ではなく「出目」という言葉そのものを喋ってしまうので注意しましょう。
旗を押してからネコを何度かクリックしてみます。吹き出しに1〜6の数字が表示され、ステージ左上の変数表示と同じ数値になっていれば成功です。
もし同じ数字が連続しても焦らず、設定した範囲やプログラムの流れを落ち着いて確認してみましょう。
この回は「6」が選ばれました。変数の表示と吹き出しの数字が正しく一致しています。

20回の結果の記録と出現回数の比較

一回分の値と結果の一覧
変数「出目」は、新しい数値が入ると前に入っていた値が上書きされて消えてしまいます。
何度もサイコロを振った結果を振り返って比べるには、ノートにメモを取るか、Scratchの「リスト」機能を活用します。
リストとは、複数のデータを順番に並べてまとめて記録できる仕組みです。「変数『出目』は直近の1回分だけを記録し、リストはこれまでの履歴を一覧として残す」と役割を分けるとスッキリ整理できます。Scratch Foundationの変数とリストの解説
「変数」カテゴリーの「リストを作る」をクリックし、「結果」という名前のリストを「すべてのスプライト用」で作成します。ステージ上にリストの枠が表示されるので、見やすい位置に配置しておきましょう。
「結果」というリストを作成し、複数回の出目を順番に記録していきます。

一度のクリックで20回分を残す発展版
先ほど作成したクリック用のコードを、次のように改造します。前のコードを残したまま横に並べると両方動いてしまうため、元のブロックを置き換えて作ってください(緑の旗のコードはそのままでOKです)。
「20回繰り返す」の中に、出目を決めてから待つまでの一連の処理を入れ込みます。こうすることで、1回ごとに新しい乱数を引き、その数値をリストへ順番に追加できます。実行中はネコを連打せず、20回分の記録が終わるまで見守りましょう。

最初に入っている「結果のすべてを削除する」は、実験を始める前に前回の履歴をリセットし、きっちり20回分のデータだけを残すための命令です。もしこれを繰り返しの内側に入れてしまうと、新しい数字が入るたびに前の結果が消えてしまいます。
逆に、乱数を引く命令を繰り返しの外側(手前)に出してしまうと、「最初に選ばれた同じ数字」が20回連続で追加されてしまいます。もし同じ数字ばかりがズラリと並んでしまったら、乱数ブロックの位置を確かめてみましょう。
1回クリックするだけで、リストに20件の出目が一瞬で記録されます。途中で同じ数字が連続している様子も確認できます。
出目ごとの回数を比べる表
リストに20回分の結果が溜まったら、1〜6の数字がそれぞれ何回出たかを数えてみましょう。
以下の表をノートなどに写し、自分の結果を書き込んでみてください。
| 出目 | 出た回数 |
|---|---|
| 1 | (自分の結果を記入) |
| 2 | (自分の結果を記入) |
| 3 | (自分の結果を記入) |
| 4 | (自分の結果を記入) |
| 5 | (自分の結果を記入) |
| 6 | (自分の結果を記入) |
| 合計 | 20回になっているか確認 |
1回目の結果をメモしたら、もう一度ネコをクリックしてみましょう。古い記録がリセットされ、新しい20回分のデータが記録されます。
まったく同じプログラムを実行していても、回ごとのばらつき(偏り)が変化することが実感できるはずです。
乱数で起こる偏りと同じ目の連続

少ない回数ではそろわない出現回数
ある出来事の起こりやすさを割合で表したものを「確率」と呼びます。
イカサマのない公平なサイコロなら、どの目も出る確率は等しく「6分の1」です。今回のScratchプログラムも、1〜6がまったく同じ確率で選ばれる設計になっています。
しかし、確率が同じだからといって、たった20回の試行で全数字が均等に出るわけではありません。
そもそも「20」は6で割り切れないため、6つの目がきれいに同じ回数になることはあり得ません。一度も出ない目があったり、特定の数字ばかり多く出たりしても、プログラムの不具合ではないのです。
例えば60回振った場合、理論上の目安は「60÷6=各10回」になります。
しかし、実際に60回振ってみても、すべての目がきっちり10回ずつ綺麗に揃うことは滅多にありません。
「確率から考えて何回出そうか(理論値)」と「実際にやってみて何回出たか(実験結果)」は分けて考えるのがポイントです。
予想と違う結果になったときは、単なる偶然の偏りなのか、それともプログラムの範囲設定にミスがあるのかを冷静に見極めましょう。
前に出なかった目と次の一回
サイコロを振っていてしばらく「6」が出ないと、「そろそろ次は6が出るんじゃないか」と思いがちです。
しかし、今回のプログラムは「前に何が出たか」を記憶して次の候補を変えるような処理はしていません。毎回新しく、フラットな状態で1〜6の中から選んでいます。
直前に6が出たとしても、次の候補から6が消えるわけではありません。連続して6が出ることもあれば、何十回も出ないこともあります。「前と違う数を選ぶ」という特別な命令を組み込まない限り、過去の結果に引っ張られることはないのです。
もし「直前と同じ数字は絶対に出したくない」と考えるなら、それはサイコロとは別のルールになります。前回の値を別の変数に保存しておき、新しく選んだ数と比較してやり直すような処理が必要です。どんな動きを作りたいのか、ルールの設計をあらかじめ明確にしておきましょう。
計算で数を選ぶ擬似乱数
コンピューターが扱う乱数の多くは、複雑な計算式によってランダムに見える数字の並びを作り出す「擬似乱数(ぎじらんすう)」です。
Scratchの乱数ブロックも、裏側では「JavaScript」というプログラミング言語の乱数生成の仕組みを利用しています。
現在のScratchの内部処理では、1〜6の整数を選ぶとき、まず「0以上1未満」のランダムな小数を生成し、それを計算によって6等分して1〜6の整数に変換しています。例えば、もとの小数が「0.4」だった場合、6倍すると「2.4」になり、小数点以下を切り捨てて「2」にしてから1を足すことで「3」という整数を導き出しています。Scratchの公式実装コード
もちろん、作品を作るときにこのややこしい計算式を自分で書く必要はありません。乱数ブロックに範囲を指定するだけで、Scratchが裏で自動的に計算して使いやすい整数を返してくれます。
乱数を使ったゲームの工夫

出目に応じて変える得点
「サイコロで6が出たときだけ、ネコが『当たり!』と喜ぶ」という演出を作りたいときは、出目を決めた直後に「もし〜なら」の条件分岐ブロックを追加します。
1回振るタイプのコードを、以下のように改良してみましょう。

「もし」の条件式の中でも、変数「出目」を使っているのがポイントです。
もしこの条件部分に新しく「1から6までの乱数」ブロックを入れてしまうと、サイコロの出目とはまったく別の数を引いて判定してしまうため、おかしな動作になってしまいます。
「6」が出たため、「もし」の中の命令が実行されて「当たり!」と表示されました。

ゲームにスコア機能を付けるなら、「どの目が出たら何点入るか」をあらかじめ決めておきましょう。
「乱数で数を選ぶ処理」と「選ばれた数に応じてアクションを起こす処理」をしっかり切り離して作っておくと、後からルールを変更しやすくなります。
現れる場所や待ち時間の変更
乱数で選んだ数値は、サイコロの目以外にもさまざまなゲーム要素に応用できます。
スプライトのX座標(横の位置)に乱数を使えば敵の出現場所をバラバラにできますし、待ち時間に使えばアイテムが出現するタイミングを予測不能にできます。
例えば、待ち時間を「2から4までの乱数」に設定した場合、候補は「2秒・3秒・4秒」のいずれかになります。
もちろん、同じ秒数が連続することもあります。数値を変更した後は、プレイヤーが反応できる難易度になっているか、待ち時間が長すぎて退屈にならないかを実際にプレイして調整しましょう。
リンゴが落ちてくる間隔に乱数を使う具体的な例は、Scratchのジャンプゲームの作り方でも詳しく解説しています。
サイコロで乱数の基礎を掴んでおくと、「どこで数を選び、その数を何に使っているか」がスムーズに読み解けるようになります。
サイコロ作りで起きやすい間違い

思い通りに動かないときは、「選ぶ(乱数)」「保存する(変数)」「表示する(見た目)」のどの段階でトラブルが起きているのかを順番にチェックしましょう。
すべてを一度にいじらず、1つずつ原因を切り分けるのがデバッグ(不具合修正)のコツです。
| 困った現象 | チェックするポイント |
|---|---|
| 「0」が出る、または「6」が絶対に出ない | 乱数の範囲が「1から6」になっているか。最初の「0にする(初期化)」が表示されていないか |
| 数字ではなく「出目」という文字が表示される | 丸い「出目」変数ブロックを使わず、枠に手入力で文字を打ち込んでいないか |
| クリックしていないのに数字が激しく変わり続ける | 「ずっと」ブロックの中など、自動でループする場所に乱数を入れていないか |
| 20回実行したはずなのにリストに1個しか残らない | 「結果のすべてを削除する」ブロックが「繰り返す」の内側に入っていないか |
| 20個のデータがすべて同じ数字になってしまう | 乱数を決める命令が「繰り返す」の外側(手前)に出ていないか。位置が合っているなら、もう一度実行して確認する |
| コードを直したのに動きが変わらない | 直したコードが、クリックしているスプライト自身に設定されているか(別のスプライトを選んでいないか) |
同じ数字が連続すること自体はバグではありません。
乱数ブロックの範囲設定と、ブロックを配置した場所が正しいかを確認したうえで、何回か動かして結果を観察してみましょう。
2個のサイコロで考える発展問題

1個のサイコロが完成したら、サイコロを2個同時に振ったときの「合計値」について考えてみましょう。
1〜6のサイコロを2個振ると、合計値は「2〜12」になります。
では、「2から12までの乱数」を1回引くプログラムを作れば、サイコロを2個振ったことと同じになるでしょうか?
答えは「同じにはならない」です。出る数字の範囲(2〜12)は同じですが、「それぞれの数字の出やすさ(確率)」がまったく異なります。
2個のサイコロを振ったとき、合計が「2」になる組み合わせは「1と1」の1通りしかありません。しかし、合計が「7」になる組み合わせは「1と6」「2と5」「3と4」「4と3」「5と2」「6と1」の6通りもあります。
サイコロ2個の出目の組み合わせは全部で「6×6=36通り」あり、合計2が出る確率は36分の1ですが、合計7が出る確率は36分の6(6分の1)と、圧倒的に7の方が出やすくなります。しかし「2から12までの乱数」を使ってしまうと、2も7も12も、すべて同じ確率(11分の1)で選ばれてしまいます。
本物のサイコロ2個の動きを正しく再現したいなら、「1から6までの乱数」を2回選び、その2つの変数を足し合わせるプログラムを作る必要があります。
「結果として出る数値の範囲」だけでなく、「その数値がどうやって決まるのかという過程」に目を向けることで、よりリアルで思い通りのゲームルールを構築できるようになります。
乱数の理解を確かめる練習問題

次の3つの問題について、実際にプログラムを動かす前に頭の中で答えを予想してみてください。迷ったら、Scratchでブロックを組んで確かめてみましょう。
Q1. 「1から3までの乱数」で、「3」が出ることはありますか?
A1. 出ます。
両端に整数を指定した場合、1・2・3の3つが等しい確率で選ばれます。「4」が出ることはありません。
Q2. 1〜6の乱数を一度変数に保存した後、別の乱数ブロックを使って画面に表示した場合、保存した数と同じになりますか?
A2. 同じになるとは限りません(違う数になることがあります)。
別の乱数ブロックを実行した時点で、新しく数字が引き直されてしまうためです。
振った出目をそのまま使いたいときは、新しく乱数を引くのではなく、保存した「変数」を呼び出して使いましょう。
Q3. 「1〜6の数字が1回ずつ重複なしで順番に出るプログラム」は、乱数ブロックだけで作れますか?
A3. 乱数ブロック単体では作れません。
乱数は毎回ランダムに選ぶため、ただ6回繰り返すだけでは同じ数字が重複したり、出ない数字があったりします。
すべての数字を1回ずつ出したい場合は、リストなどを使って「一度出た数字を候補から除外する」という別の仕組みを組み合わせる必要があります。
乱数を学ぶときの確認ポイント

乱数を活用することで、あらかじめ決めた範囲の中から数値をランダムに抽出し、サイコロの目や敵の出現位置、イベントの待ち時間などに変化をつけることができます。そして、選ばれた数値をゲーム内で判定や表示に使い回したいときは、「変数」に保存して使いましょう。
お子さんの学習を見守る際は、「範囲を0〜6に変えたらどうなるかな?」「乱数を繰り返しの外に出したら記録はどう変わると思う?」といったように、変更を加えたときの動作を予想してもらう声かけが効果的です。
予想してから実際に動かしてみることで、ブロックの役割とプログラムの挙動の結びつきがより深く理解できるようになります。
「ちゃんと数字が変わったか」を確認するだけでなく、「この数字はどこから来たのかな?」「同じ数字が続いたときはどこをチェックすればいい?」など、仕組みについての対話を楽しんでみてください。
Scratchでの作品づくりを通してプログラミングの基礎概念をしっかり身につけたい方は、ぜひテックチャンスの無料体験授業もチェックしてみてください。