【6日でできるJava入門】ランダム数

 プログラムで「予測できない動き」を実現するためには、ランダム(無作為)な数値が必要です。例えば、県庁所在地当てクイズで毎回ランダムに都道府県や選択肢を出題すれば、ユーザーにとって新鮮な体験になります。
Javaでは、主にjava.util.RandomクラスやMath.random()メソッドを使ってランダム数を扱います。


1.Randomクラスの基本

1.1. Randomクラスの概要と初期化

  • java.util.Randomはランダム数生成専用のクラスです。
  • 初期化方法
import java.util.Random;
Random rand = new Random();

このオブジェクトrandから色々な型のランダム値を取り出せます。

1.2. ランダム数の生成方法

メソッド戻り値の型説明
nextBoolean()booleantrue または false
nextInt()intint範囲でランダムな整数
nextInt(int n)int0以上 n未満のランダムな整数
nextLong()longlong範囲でランダムな整数
nextDouble()double0.0以上1.0未満のランダムな実数
nextFloat()float0.0以上1.0未満のランダムな実数

サンプル:0~9のランダムな整数を10個生成

ファイル名: lesson23_1.java

import java.util.Random;

public class lesson23_1 {
    public static void main(String[] args) {
        Random rand = new Random();
        for (int i = 0; i < 10; i++) {
            int n = rand.nextInt(10); // 0~9
            System.out.println("乱数: " + n);
        }
    }
}

実行結果(毎回違う)

乱数: 7
乱数: 7
乱数: 8
乱数: 8
乱数: 4
乱数: 2
乱数: 7
乱数: 5
乱数: 1
乱数: 3

2.県庁所在地当てクイズへの応用

2.1. ランダム出題の基本

都道府県名・県庁所在地名のペアをファイルからArrayListに読み込み、ランダムで出題します。
問題文、選択肢も毎回ランダムで並べ替え、出題済みデータはリストから削除します。

サンプル:ランダム出題と選択肢生成

ファイル名: lesson23_2.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Random;

public class lesson23_2 {
    public static void main(String[] args) throws Exception {
        // データの読み込み
        BufferedReader br = new BufferedReader(new FileReader("prefectures.txt"));
        ArrayList<String> prefectures = new ArrayList<String>();
        ArrayList<String> capitals = new ArrayList<String>();

        String line;
        while ((line = br.readLine()) != null) {
            int pos = line.indexOf(',');
            prefectures.add(line.substring(0, pos));
            capitals.add(line.substring(pos + 1));
        }
        br.close();

        Random rand = new Random();

        // 3問だけ出題
        for (int i = 1; i <= 3; i++) {
            int qIndex = rand.nextInt(prefectures.size());
            String question = prefectures.remove(qIndex);
            String correct = capitals.remove(qIndex);

            // ダミー選択肢を作成
            ArrayList<String> choices = new ArrayList<String>();
            for (int j = 0; j < 3; j++) {
                int cIndex = rand.nextInt(prefectures.size());
                choices.add(capitals.remove(cIndex));
                prefectures.remove(cIndex);
            }

            // 正解をランダムな位置に挿入
            int insertPos = rand.nextInt(choices.size() + 1);
            choices.add(insertPos, correct);

            // 問題と選択肢を表示
            System.out.println("Q" + i + ": 「" + question + "」の県庁所在地は?");
            for (int k = 0; k < choices.size(); k++) {
                System.out.println((k + 1) + ": " + choices.get(k));
            }
            System.out.println("(正解は" + (insertPos + 1) + ")");
        }
    }
}

ファイル名:prefectures.txt

Eclipseの場合、プロジェクト直下にこのファイルを配置します。

北海道,札幌
青森県,青森
岩手県,盛岡
宮城県,仙台
秋田県,秋田
山形県,山形
福島県,福島
茨城県,水戸
栃木県,宇都宮
群馬県,前橋
埼玉県,さいたま
千葉県,千葉
東京都,東京
神奈川県,横浜
新潟県,新潟
富山県,富山
石川県,金沢
福井県,福井
山梨県,甲府
長野県,長野
岐阜県,岐阜
静岡県,静岡
愛知県,名古屋
三重県,津
滋賀県,大津
京都府,京都
大阪府,大阪
兵庫県,神戸
奈良県,奈良
和歌山県,和歌山
鳥取県,鳥取
島根県,松江
岡山県,岡山
広島県,広島
山口県,山口
徳島県,徳島
香川県,高松
愛媛県,松山
高知県,高知
福岡県,福岡
佐賀県,佐賀
長崎県,長崎
熊本県,熊本
大分県,大分
宮崎県,宮崎
鹿児島県,鹿児島
沖縄県,那覇

実行結果

Q1: 「埼玉県」の県庁所在地は?
1: さいたま
2: 福井
3: 岡山
4: 福岡
(正解は1)
Q2: 「三重県」の県庁所在地は?
1: 千葉
2: 山口
3: 津
4: 奈良
(正解は3)
Q3: 「福島県」の県庁所在地は?
1: 松山
2: 福島
3: 札幌
4: 新潟
(正解は2)

…(毎回ランダム)

3.Randomクラスの応用

3.1. 一度出題・使用した選択肢の排除

  • 選択肢や問題で使用した要素はリストからremove()しておくことで、同じデータが重複して出題されるのを防ぐことができます。

3.2. Math.random()との違い

メソッド特徴
Math.random()0.0以上1.0未満のdouble値を返す静的メソッド。
new Random().nextInt(n)0以上n未満のint値を返す。多様な乱数型が扱える

4.Randomクラス主要APIまとめ

メソッド説明
nextInt()int範囲の乱数
nextInt(int n)0~n-1の乱数(範囲指定)
nextBoolean()true/false
nextDouble()0.0~1.0の実数
nextFloat()0.0~1.0の実数

まとめ

  • Randomクラスで乱数生成し、出題や選択肢のバリエーションを自在にコントロールできる。
  • 使用済みデータはremove()で除去し、重複出題を防ぐ。
  • nextInt(int n)でリストのランダムな要素を取り出すのが王道。
  • 予測不能な「動き」を加えることで、クイズやゲームの面白さがアップします。