Arduinoで使える乱数の実行時間
2021年2月3日:FastLED-masterにある8bit乱数関数
この続き・・・
偏りの少ない乱数値の発生、桁数8bitのrand8()を使うと
数の出現がおかしくなることが分かりました。
※256を割れる値で乱数を得る場合はok。
※なんといっても早い。
速度を追い求めないなら、今までどおり16bitのrand()か
あるいは32bitのrandom()。
その実行速度をオシロで見てみました。
こんなスケッチ。
/***** rand()とrandom()の速度を見てみる *****/
// タイミング確認パルス
#define PB0_H (PORTB |= (1 << PB0)) // (!!!)PB0:D8 H/L
#define PB0_L (PORTB &= ~(1 << PB0))
#define PB1_H (PORTB |= (1 << PB1)) // (!!!)PB1:D9 H/L
#define PB1_L (PORTB &= ~(1 << PB1))
#define PB2_H (PORTB |= (1 << PB2)) // (!!!)PB2:D10 H/L
#define PB2_L (PORTB &= ~(1 << PB2))
#define PB3_H (PORTB |= (1 << PB3)) // (!!!)PB3:D11 H/L
#define PB3_L (PORTB &= ~(1 << PB3))
/***** セットアップ *****/
void setup()
{
pinMode(8, OUTPUT); // タイミングチェック用
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
/***** ループ *****/
void loop()
{
volatile byte r;
volatile uint16_t r1; // rand() 結果
volatile uint8_t r2; // rand() % r 結果
volatile uint32_t r3; // random() 結果
volatile uint8_t r4; // random() % r 結果
r = 1 + (rand() % 255); // 1~255を乱数で
PB0_H; // (!!!)
r1 = rand(); // 16bit乱数
PB0_L;
PB1_H; // (!!!)
r2 = r1 % r; // rand() % r, 16bit/8bit
PB1_L;
PB2_H; // (!!!)
r3 = random(); // 32bit乱数
PB2_L;
PB3_H; // (!!!)
r4 = r3 % r; // random() % r, 32bit/8bit
PB3_L;
}
得られた波形。
ch1:16bitのrand()。
ch2:16bit % 8bit 剰余の実行時間。
ch3:32bitのrandom()。
ch4:32bit % 8bitの実行時間
| 固定リンク
「Arduino」カテゴリの記事
- DDS IC「AD9833」をArduino UNO R3で制御:箱入れ #2(2025.07.03)
- DDS IC「AD9833」をArduino UNO R3で制御:箱に入れる(2025.06.30)
- UNO R4はanalogWrite(n,128)でデュティー50%の方形波が出るぞ(2025.06.03)
- DDS IC「AD9833」の出力にバッファアンプを(2025.05.27)
- DDS IC「AD9833」をArduino UNO R3で制御(2025.05.25)
コメント
剰余の代わりに、
乗算/32768、乗算/0x8000000
に変えてみると。。。
r2 = r1 % r; // rand() % r, 16bit/8bit
↓
r2 = ((uint32_t)r1 * r) / 32768;
r4 = r3 % r; // random() % r, 32bit/8bit
↓
r4 = ((uint64_t)r3 * r) / 0x80000000;
r2のほうは13us→9usに
r4のほうは39us→22usに
と、ちょいスピードアップ。
多桁の乗除算、8bitマイコンには荷が重い。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2021年2月 5日 (金) 11時21分