« カラーLEDテープ(WS2812B)の制御信号 | トップページ | オフカメラシューコード改造 »

2021年1月28日 (木)

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); 
   と書いておくかな。

|

« カラーLEDテープ(WS2812B)の制御信号 | トップページ | オフカメラシューコード改造 »

Arduino」カテゴリの記事

コメント

続き・・・
2021年1月30日:8bit乱数関数 random8()
http://igarage.cocolog-nifty.com/blog/2021/01/post-84ffe9.html

投稿: 居酒屋ガレージ店主(JH3DBO) | 2021年1月30日 (土) 11時06分

コメントを書く



(ウェブ上には掲載しません)




« カラーLEDテープ(WS2812B)の制御信号 | トップページ | オフカメラシューコード改造 »