0
0

More than 1 year has passed since last update.

【Java】Math.randomを使わずに手軽にサイコロを作りたい【Collections】

Posted at

サイコロを作りたい

ランダムに1〜6の数字が出るようなプログラムを作ってサイコロを振りたい!
Javaでサイコロを作る、と言われたら、皆さんは何を思い浮かべますか?

解答

リファレンス:Math.random 
通常、Math.random()クラスを用いて以下のような形で記述すると思います。
これはおそらく一番一般的な方法で、Javaを勉強する時に練習問題等で解いた方も多いのではないでしょうか。
Main.java
public class Main {
    public static void main(String[] args) {
        int dice_num = (int)( Math.random() * 6 + 1 );
        System.out.println ( "サイコロ振ったら" + dice_num + "が出た" );
    }
}

でもこれ、勉強してた時は覚えてたけどMath.random()の書き方を毎回忘れてしまう。。

Math.random()を使わずにどう書くか

僕はListを使ってサイコロを振るのが直感的にも分かりやすくて好きです。
Math.random()を使わない
import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> dice = new ArrayList<Integer>(6); // サイコロを作る(長さ6のリストを作る)
        for (int i = 0; i < list.size(); i++) {
            list.add(i + 1); // リストに1〜6の数字を入れる
        }
        Collections.shuffle(list); // リストの順番をぐちゃぐちゃにシャッフルして入れ替える
        System.out.println ("サイコロ振ったら" + list.get(0) + "が出た"); // シャッフルしたリストの先頭の1つを取り出す
    }
}

こんな風にメソッドに分けてもいいですね。

メソッドに分ける
import java.util.*;

public class Main {
    public static void main(String[] args) {
        System.out.println ("サイコロ振ったら" + dice(6) + "が出た"); // ※dice()の引数がサイコロの最大値
    }

    // 以下、メイン文から切り分けた部分をメソッド化した
    private int dice(int seed) {
        List<Integer> dice = new ArrayList<Integer>(seed); // サイコロを作る(長さ"seed"のリストを作る)
        for (int i = 0; i < list.size(); i++) {
            list.add(i + 1); // リストに1〜seedの数字を入れる
        }
        Collections.shuffle(list); // リストの順番をぐちゃぐちゃにシャッフルして入れ替える
        return list.get(0); // シャッフルしたリストの先頭の1つを取り出して返却
    }
}

こうしておく事で1〜6だけでなく、diceの引数を変えれば1〜10など別の形のサイコロでも簡単に作れるようになりました!

応用

数字のサイコロだけじゃなくて、文字列のサイコロや小数のサイコロ、自分が作った型のサイコロも自由に作れますね!
整数以外のサイコロ
import java.util.*;

public class Main {
    public static void main(String[] args) {
        System.out.println (stringDice()); // "あ"〜"お"のうち、ランダムな1文字を出力
    }

    private String stringDice() {
        List<String> dice = new ArrayList<String>(5); // サイコロを作る(長さ5の文字列リストを作る)
        list.add("あ");
        list.add("い");
        list.add("う");
        list.add("え");
        list.add("お");
        Collections.shuffle(list); // リストの順番をぐちゃぐちゃにシャッフルして入れ替える
        return list.get(0); // シャッフルしたリストの先頭の1つを取り出して返却
    }
}

まとめ

ここまでリストを利用したサイコロを紹介しましたが、Math.random()を利用しても上記のような動きは実装可能です。
しかし、個人的にはこのリストを使った方法の方が直感的で分かりやすいので気に入っています。

①サイコロを作って「new ArrayListして」
②サイコロを振って「Collections.shuffleして」
③一番上に出ている目を見る「list.get(0)」

以上です。
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0