Arduinoの乱数関数「random」に違和感
Arduino、あれこれ便利なんですが昔人間には
ちょいと違和感のある関数に遭遇しました。
それが「random」。
乱数が32bitのlong値で得られます。
出てくるのは「0~0x7FFFFFFF」。
ある値までの乱数が欲しければ「剰余」を使って
計算します。
b = random() % a;
これで「0 ~ (a-1)」の数値が得られます。
つまり数字の数が「a種類」。
Arduinoは「C++」なんで「random」はこんな書き方もOK。
※昔人間(Cだぜぃ)にはここらが難しい。
基本が
(1) random(void)
そしてパラメータが1つ。
(2) random(long howbig)
さらに2つも。
(3) random(long howsmall, long howbig)
(1)は16bit値のrand()と同じなんで、自分で剰余を求めて
処理すればヨシ。
そして、(2)で出てくる結果が「0 ~ (howbig-1)」。
(1)で剰余を求めた時と同じ結果になるわけです。
しかし、出てくる最大値、「howbig - 1」を勘違いしない
かが気になるのです。
自分で剰余を求めれば「-1」の違いを勘違いすることは
まぁありません。
しかし、便利そうな関数です。
「-1」を気にせず「0 ~ howbig」が出てくるようにしてあ
るんじゃ? ・・と、思いませんか?
random(100);
としたら「0から100まで」の乱数が出てくるんじゃ・・・。
もう一つ勘違いしそうなのが(3)の書式。
これで出てくる値の範囲が「howsmall ~ (howbig - 1)」。
最大値が関数に記した値の「-1」になります。
random(10, 100);
としたら、「10~100」の値が出るようにしてあるんじゃ
ないかと期待・・・。
ところが「10~99」が出てきます。
この最大数値が「-1」になること、(2)や(3)の書式では
要注意ということでちょいとメモ。
※これ、私は勘違いしちゃいます。
random(10, 100+1);
と書いておくかな。
| 固定リンク
「Arduino」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
- Arduino UNOで3相モーターを回す(2023.05.01)
- Arduino サーミスタを使った温度測定で 【ゼロ除算問題】(2023.03.23)
- A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?(2023.03.21)
コメント
続き・・・
2021年1月30日:8bit乱数関数 random8()
http://igarage.cocolog-nifty.com/blog/2021/01/post-84ffe9.html
投稿: 居酒屋ガレージ店主(JH3DBO) | 2021年1月30日 (土) 11時06分