Цитата(mdmitry @ Apr 20 2009, 13:58)

Осталось только получить миллион нагенерированных значений и отдать на растерзание MATLABу с целью проверки статистики.
(В свое время искал генератор псевдослучайных чисел для AVR с более-менее равномерным распределением, проверял именно так.)
миллион лень было ждать
Код
#include <avr/io.h>
#include <stdlib.h>
volatile uint8_t result;
volatile uint32_t temp;
uint32_t M1[10],M2[10];
int main(void)
{
uint16_t tmp16;
uint32_t tmp32;
uint32_t i;
srand(1);
for (i = 0; i < 200000; i++)
{
tmp16 = rand();
result = tmp16 % 10;
M1[result]++;
}
srand(1);
for (i = 0; i < 200000; i++)
{
tmp16 = rand();
tmp32 = ((uint32_t)tmp16 << 2) + tmp16; // * 5
tmp16 = tmp32 >> 8; // /256
tmp16 <<= 2; // * 4
result = tmp16 >> 8; // /256
M2[result]++;
}
return 0;
}
Результат:
Код
M1 M2
0 19829 20100
1 20131 19708
2 19867 20017
3 19951 19797
4 20045 20082
5 19890 20012
6 20095 20147
7 20420 20263
8 19648 20070
9 20124 19804
Как видно 2 способ дает лучшее распределение
Код
result = tmp16 % 10; <--- 204 такта
Код
tmp32 = ((uint32_t)tmp16 << 2) + tmp16; // * 5
tmp16 = tmp32 >> 8; // /256
tmp16 <<= 2; // * 4
result = tmp16 >> 8; // /256
35 тактов
Итого: 204/35 =5,8 раз
Цитата(demiurg_spb @ Apr 20 2009, 15:56)

Я считаю что не стоит сильно запрягаться по поводу равномерности и эквивалентности этих операций.
Тут интересна реальная разница в скорости. Т.к. N%10 используется ну очень и очень часто и безотносительно rand().
В данном случае мы берем разные "биты" из исходных 15бит от rand()
А %10 вроде уже неоднократно обсуждали