【Aruduino IDE】ランダムな値を生成する(random()、randomSeed())

目次

random関数について

random(256) は、Arduinoで乱数を生成する際に使用される関数 random() の一例です。この関数は、0から指定した最大値未満(この場合は256未満)の乱数を返します。

random(256) の詳細

  • 関数の役割: random(max) は、0から max - 1 までの範囲の乱数を生成します。random(256) の場合、返される値は 0 から 255 までの任意の整数です。
  • 範囲: random(256) が生成する乱数は、次の範囲にあります:
    • 最小値: 0
    • 最大値: 255
  • 用途: random(256) は、0から255までの範囲でランダムに値を選択したいときに便利です。例えば、LEDの明るさをランダムに変える、シリアル通信でランダムなデータを送信する、ランダムに色を変える(RGBの各値が0から255までの範囲であるため)など、多くの場面で使用できます。

以下は、random(256) を使ってLEDの明るさをランダムに変えるコードの例です:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  int brightness = random(256); // 0から255までのランダムな値を取得
  analogWrite(LED_BUILTIN, brightness); // LEDの明るさを設定
  delay(100); // 100ミリ秒待機
}

この例では、LEDの明るさが0から255の範囲でランダムに変化します。

まとめ

random(256) は、0から255までの整数をランダムに生成する関数です。Arduinoの様々なプロジェクトで、ランダム性を持たせるために広く利用されています。

randomSeed(analogRead(0)関数について

randomSeed(analogRead(0));は、Arduinoでランダムな数値を生成する際に使われる、シード(初期値)を設定する方法です。このコードの詳細について説明します。

背景と必要性

  • ランダム数の生成:
    • Arduinoのrandom()関数は擬似乱数を生成します。擬似乱数は、実際にはアルゴリズムによって生成される数値であり、シード値に基づいて決まった順序で数値が生成されます。つまり、同じシード値を使えば、同じ順序で同じ数値が生成されます。
  • randomSeed()関数:
    • randomSeed(seed)は、random()関数が乱数生成を開始するためのシード値を設定します。シードが同じであれば、生成されるランダム数の列も同じになります。シードを異なる値に設定することで、より「ランダム」に見える値が生成されます。

randomSeed(analogRead(0)); の解説

  1. analogRead(0):
    • analogRead(0)は、Arduinoのアナログピン(A0)からのアナログ入力値を読み取ります。読み取られる値は0から1023までの範囲で、通常は10ビットの分解能を持ちます。
    • アナログピンに接続されていない状態では、このピンは「浮いている」(フローティング状態)ため、読み取られる値はノイズや環境要因に影響され、予測不能な値になります。これにより、ある程度「ランダム性」のある数値が得られます。
  2. randomSeed(analogRead(0));:
    • analogRead(0)で読み取った値をシードとしてrandomSeed()に渡すことで、Arduinoがプログラムを実行するたびに異なるシード値が設定されます。これにより、random()関数が生成する乱数の列が毎回異なるようになります。

なぜこれが重要か

  • 予測可能性の回避:
    • デフォルトでは、Arduinoの電源を入れるたびに同じシード値が設定されるため、同じ順序でランダム数が生成されます。これではランダム性が失われます。しかし、randomSeed(analogRead(0));を使用することで、毎回異なるシード値が設定され、乱数が「本当にランダムに」生成されるようになります。
  • セキュリティとゲームの応用:
    • ランダム性が重要なアプリケーション、例えばゲームやセキュリティ関連のアルゴリズムでは、予測不可能な乱数が必要です。この方法を使うことで、意図しない予測可能性を回避できます。

実践的な使用例

以下は、randomSeed(analogRead(0));を使った簡単な乱数生成のスケッチです。

void setup() {
  Serial.begin(9600);

  // アナログピンから読み取った値でシードを設定
  randomSeed(analogRead(0));

  // 乱数を生成してシリアルモニタに出力
  for (int i = 0; i < 10; i++) {
    int randomNumber = random(0, 100); // 0から99までの乱数
    Serial.println(randomNumber);
  }
}

void loop() {
  // 何も実行しない
}

  • このコードをArduinoにアップロードして、シリアルモニタを確認すると、毎回異なる10個の乱数が生成されるのを確認できます。

結論

randomSeed(analogRead(0));は、Arduinoでランダムな数値を生成する際に重要な役割を果たします。アナログピンからのノイズを利用してシード値を設定することで、random()関数が生成する乱数列が毎回異なるようになり、より「ランダム」に見える数値を生成できます。これは、特にランダム性が重要なプロジェクトにおいて有用です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次