java.util.Randomクラスのインスタンスを使うと、Javaで乱数を生成できます。
整数の乱数は、nextInt()メソッドを使って生成できます。
これで、Integer.MIN_VALUEからInteger.MAX_VALUEまでの範囲の値が生成されます。
Random random = new Random();
random.nextInt();
// => -1169335537
生成される値の範囲を制限するには、nextInt(int)を使います。
これで、0(含む)から指定した上限(含まない)までの範囲の値が生成されます。
たとえば、次のコードは0から9までの乱数を生成します。
Random random = new Random();
random.nextInt(10);
// => 6
そして、次のコードは10から19までの乱数を生成します。
Random random = new Random();
10 + random.nextInt(10);
// => 11
小数の乱数は、nextDouble()メソッドを使って生成できます。
これで、0.0から1.0までの範囲の値が生成されます。
Random random = new Random();
random.nextDouble();
// => 0.19250004204021398
そして、次のコードは100.0から200.0までの乱数を生成します。
Random random = new Random();
100.0 + 100.0 * random.nextDouble();
// => 111.31849856260328
Maryはテレビシリーズ_スター・トレック:新世代_の大ファンです。 彼女はよく、友人たちと一緒に_宇宙船エンタープライズ_の乗組員になりきって遊ぶ、ペンと紙のロールプレイングゲームをします。 Maryが演じるキャラクターはピカード艦長なので、艦長日誌を付けることになります。 彼女はゲームの創造的な部分が大好きですが、その場でランダムなデータを作るのは苦手です。
艦長日誌によく登場するデータをランダムに生成する仕組みを作って、Maryを手伝いましょう。
この演習のスターター実装は、java.util.Randomのインスタンスをコンストラクターの引数として受け取ります。
これにより、演習のテストでは、あらかじめ決められたシードを持つインスタンスを渡せるようになり、テスト結果が予測可能になります。
そのため、実装では、与えられたjava.util.Randomのインスタンスを使うことが求められます。
_宇宙船エンタープライズ_は、旅の途中でたくさんの惑星と出会います。
スタートレックの世界では、惑星はその性質によっていくつかのクラスに分けられています。
たとえば、地球はクラスMの惑星です。
惑星のクラスは、D、H、J、K、L、M、N、R、T、Yのいずれかです。
randomPlanetClass()メソッドを実装しましょう。
このメソッドは、惑星のクラスをランダムに1つ返します。
captainsLog.randomPlanetClass();
// => "K"
宇宙を飛び回っているのはエンタープライズ(登録番号NCC-1701)だけではありません!
別の宇宙船とランデブーしたとき、Maryはその宇宙船の登録番号を日誌に記録する必要があります。
登録番号は「NCC-」という接頭辞で始まり、そのあとに1000から9999までの数値(両端を含む)が続きます。
ランダムな宇宙船の登録番号を返すrandomShipRegistryNumber()メソッドを実装しましょう。
captainsLog.randomShipRegistryNumber();
// => "NCC-1947"
日付のない日誌に、なんの意味があるでしょうか?
宇宙暦は小数です。
_宇宙船エンタープライズ_の冒険のうち、_新世代_のシーズン1の物語は、宇宙暦41000.0から42000.0の間に起こります。
「4」は24世紀を、「1」はシーズン1を表しています。
41000.0以上42000.0未満の小数を返すrandomStardate()メソッドを実装しましょう。
captainsLog.randomStardate();
// => 41458.15721310934