船長日誌

船長日誌

学習演習

はじめに

多くのプログラムでは、現実世界の出来事をシミュレーションするために、(疑似)乱数が必要になります。

よくある身近な例には、次のようなものがあります。

  • コイントス:('H', 'T')からランダムに選ばれる値。
  • サイコロの目:1から6までのランダムな整数。
  • カードのシャッフル:カードの配列をランダムな順序に並べ替えること。
  • 3Dグラフィックスのシミュレーションで木や茂みを生成すること。

コンピューターで真の乱数を生成するのは驚くほど難しい技術的課題です。だからこそ、「疑似乱数」の生成器も存在します。

Caution

Math.random()関数を、セキュリティや暗号に関わる用途に使ってはいけません! この概念についての学習用の演習を終えると、さらに詳しく学べます。

乱数を生成する

JavaScriptでは、Math.random()関数を使って疑似乱数を生成できます。 この関数は、0以上1未満の疑似乱数の浮動小数点数を返します。

説明

メアリーはテレビシリーズ『スタートレック:新世代』の大ファンです。 彼女はよく、ペンと紙を使うロールプレイングゲームで遊んでいます。そこでは、メアリーと友達がエンタープライズ号のクルーになりきります。 メアリーが演じるのはピカード艦長なので、艦長のログをつける必要があります。 ゲームの創造的な部分は大好きですが、その場でランダムなデータを考えるのは苦手です。

艦長のログによく登場するデータをランダムに生成する仕組みを作って、メアリーを手伝いましょう。

1. 宇宙艦の登録番号をランダムに生成する

宇宙を飛び回っているのは、エンタープライズ(登録番号NCC-1701)だけではありません! 別の宇宙艦と出会ったとき、メアリーはその宇宙艦の登録番号をログに記録する必要があります。

登録番号は接頭辞"NCC-"で始まり、そのあとに1000以上9999以下の数値が続きます。

ランダムな宇宙艦の登録番号を返すrandomShipRegistryNumber()関数を実装しましょう。

randomShipRegistryNumber();
// => "NCC-1947"

2. 恒星日をランダムに生成する

日付が入っていなければ、ログに何の意味があるのでしょうか?

恒星日は浮動小数点数です。 『新世代』のシーズン1におけるエンタープライズ号の冒険は、恒星日41000.0から42000.0の間で繰り広げられます。 "4"は24世紀を、"1"はシーズン1を表しています。

41000.0以上42000.0未満の浮動小数点数を返すrandomStardate関数を実装しましょう。

randomStardate();
// => 41458.15721310934

3. 惑星をランダムに生成する

エンタープライズ号は、旅の途中でたくさんの惑星と出会います。 スタートレックの世界の惑星は、その性質によっていくつかのクラスに分類されています。 たとえば、地球はMクラスの惑星です。 惑星クラスとしてあり得るのは、D、H、J、K、L、M、N、R、T、Yです。

randomPlanetClass()関数を実装しましょう。 惑星クラスのいずれかをランダムに返します。

randomPlanetClass();
// => "K"
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
JavaScript Exercism

船長日誌を始める準備はできましたか?

Exercismに登録すれば、37個のコンセプト159個の演習、そして本物の人間によるメンタリングとともに、JavaScriptを学んでマスターできます。すべて無料です。