/***** 8bit乱数の出現度を比較 *****/ #define RND_LP 100000 // チェック回数 #define RND_SU 100 // 発生乱数の数 0~99の100種 word cnt_r[RND_SU]; // 剰余での発生乱数カウント // arduinoそのものの乱数 word cnt_m[RND_SU]; // 乗算での発生乱数カウント // FastLED-masterライブラリでs word cnt_r1[RND_SU]; // rand()+乗算でのカウント word cnt_m1[RND_SU]; // rand8()+剰余でのカウント // タイミング確認 #define PB4_H (PORTB |= (1 << PB4)) // (!!!)PB4:D12 H/L #define PB4_L (PORTB &= ~(1 << PB4)) #define PB5_H (PORTB |= (1 << PB5)) // (!!!)PB5:D13 H/L #define PB5_L (PORTB &= ~(1 << PB5)) // 乱数計算時間 /***** rand()+剰余による乱数 *****/ uint8_t randr(uint8_t n) { return rand() % n; // rand()で } /***** rand()+乗算による乱数 *****/ uint8_t randr1(uint8_t n) { uint8_t r = rand(); // rand()で r = (r * n) >> 8; // 乗じて1/256 return r; } /***** 乗算による乱数 *****/ // 「FastLED-master\src\lib8tion\random8.h」のライブラリによる #define RAND16_SEED 1337 uint16_t rand16seed = RAND16_SEED; // 乱数値:X(n+1) = (2053 * X(n)) + 13849) #define FASTLED_RAND16_2053 ((uint16_t)(2053)) #define FASTLED_RAND16_13849 ((uint16_t)(13849)) #define APPLY_FASTLED_RAND16_2053(x) (x * FASTLED_RAND16_2053) /// Generate an 8-bit random number uint8_t rand8() { rand16seed = APPLY_FASTLED_RAND16_2053(rand16seed) + FASTLED_RAND16_13849; return (uint8_t)(((uint8_t)(rand16seed & 0xFF)) + ((uint8_t)(rand16seed >> 8))); } /// Generate an 8-bit random number between 0 and lim /// @param lim the upper bound for the result uint8_t randm(uint8_t lim) { uint8_t r = rand8(); // rand8()で乱数 r = (r*lim) >> 8; // 乗じて1/256 return r; } /***** rand8()+剰余を使って *****/ uint8_t randm1(uint8_t n) { return rand8() % n; // 乱数はrand8()で発生 } /***** 書式指定付き英数記号文字表示 *****/ /* 「printf」と同機能 */ void txprintf(const char *s, ...) { va_list vp; char bff[60]; // 60文字分のバッファ va_start(vp,s); vsnprintf(bff, sizeof(bff), s, vp); Serial.print(bff); va_end(vp); } /***** セットアップ *****/ void setup() { pinMode(12, OUTPUT); // タイミングチェック用 pinMode(13, OUTPUT); // 乱数計算時間 Serial.begin(9600); // 9600BPSで } /***** ループ *****/ void loop() { byte i, r; long lp; Serial.println("Rand test"); // 剰余での乱数のチェックloop PB4_H; for(lp = 0; lp < RND_LP; lp++){ PB5_H; r = randr(RND_SU); // rand()+剰余での乱数 PB5_L; cnt_r[r]++; // 0~99の出現回数を+1 } // 乗算での乱数のチェックloop PB4_L; for(lp = 0; lp < RND_LP; lp++){ PB5_H; r = randm(RND_SU); // rand8()+乗算での乱数 PB5_L; cnt_m[r]++; // 0~99の出現回数を+1 } // rand()+乗算での乱数のチェックloop PB4_H; for(lp = 0; lp < RND_LP; lp++){ PB5_H; r = randr1(RND_SU); // rand()+乗算での乱数 PB5_L; cnt_r1[r]++; // 0~99の出現回数を+1 } // rand8()+剰余での乱数のチェックloop PB4_L; for(lp = 0; lp < RND_LP; lp++){ PB5_H; r = randm1(RND_SU); // rand8()+剰余での乱数 PB5_L; cnt_m1[r]++; // 0~99の出現回数を+1 } // 結果出力 Serial.println(" # cnt-r cnt-m rm 8r"); for(i = 0; i < RND_SU; i++){ txprintf("%5d %5d %5d %5d %5d\r\n", i, cnt_r[i], cnt_m[i], cnt_r1[i], cnt_m1[i]); } Serial.println("Stop"); while(1); // 停止 }