|
|
  |
WINAVR rand(), не работает RAND_MAX |
|
|
|
Apr 19 2009, 20:16
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Apr 19 2009, 23:50)  Копия из копии... Это не IAR листинг. Все. Финиш  ©zligo Уважаемый Супермодератор! Всем конечно понятно Ваше желание быть истиной в последней инстанции во всех топиках в которых Вы принимаете участие. Но я Вам не советую спорить ради спора... иначе Вы рискуете стать посмешищем... удар то Вы не очень готовы держать(отказываемся почему-то от тестов ...  ) Ну типа научитесь уже хоть иногда признавать что Ваша первая мысль была ошибочной... Это очень Вам поможет...
|
|
|
|
|
Apr 19 2009, 20:29
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(singlskv @ Apr 19 2009, 23:16)  Уважаемый Супермодератор! Гогда я модератор, я так и подписываюсь. В остальных случаях, настоятельная просьба не навешивать ярлыки. Цитата Ну типа научитесь уже хоть иногда признавать что Ваша первая мысль была ошибочной... Это очень Вам поможет... В данном конкретном случае я просто не имею времени вычитывать нечто дизассемблированное представленное вместо IAR листинга. Как не имею времени (и самое главное интереса по отношению к AVR) проделать этот хоть и простой зксперимент. То, что в AVR/IAR получение остатка от деления реализовано действительно громоздко, я увидел и запостил исходник. Пока для себя взял на заметку при реальной необходимости попробовать для AVR в реале.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 19 2009, 20:45
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Apr 20 2009, 00:29)  В данном конкретном случае я просто не имею времени вычитывать нечто дизассемблированное представленное вместо IAR листинга. Вы знаете, я то же немного программирую по работе иногда... и если я участвую в форуме и в конкретных топиках высказываю свое мнение, я обычно готов его подтвердить листингом или еще как-то... доступно... Цитата Как не имею времени (и самое главное интереса по отношению к AVR) проделать этот хоть и простой зксперимент. То, что в AVR/IAR получение остатка от деления реализовано действительно громоздко, я увидел и запостил исходник. Пока для себя взял на заметку при реальной необходимости попробовать для AVR в реале. Как сказали бы Вы как модератор, это все очевидно и обсуждалось тысячу раз и " Moderator:Просьба не загромождать основные ветки (в частности "AVR") форума простейшими вопросами."
|
|
|
|
|
Apr 20 2009, 05:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(singlskv @ Apr 19 2009, 23:45)  " Moderator:Просьба не загромождать основные ветки (в частности "AVR") форума простейшими вопросами."  Вы не считаете первоначальный вопрос банальным? Вы считаете, что первоначальный вопрос имеет хоть какое-то отношение к разделу AVR, куда его дважды запостил Автор? Или на Вас просто слово "Модератор" действует, как красная тряпка? P.S. Moderator: Вопросы риторические. Отвечать в форуме не надо. Если очень хочется - в личную почту. Ознакомлюсь по возврашению из командировки.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 20 2009, 06:41
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
вот ведь спорить любители  я провел тест за вас: Код #include <avr/io.h>
volatile uint16_t result; volatile uint32_t temp;
int main(void){
while(1){ PORTB = 1; // точка 1 result = rand() % 10; PORTB = 0; // точка 2
temp = rand() * 10UL; temp >>= 15;
PORTB = 1; // точка 3 } } target = atmega16, компилятор - WinAVR, среда - AVR Studio, сборка с оптимизацией по размеру кода ( -Os) методика теста: установка точек останова (помечены в комментариях) и замер числа тактов между точками 1 и 2 и между 2 и 3 соответственно. результаты: между 1 и 2: 1688 тактов между 2 и 3: 1634 тактов выигрыш далеко не десятикратный, речь вообще не идет о целых разах (выигрыш 3%)  в общем, результат был ожидаемым, как zltigo и "предчувствовал"
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Apr 20 2009, 08:07
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(ARV @ Apr 20 2009, 10:41)  выигрыш далеко не десятикратный, речь вообще не идет о целых разах (выигрыш 3%)  в общем, результат был ожидаемым, как zltigo и "предчувствовал"  а написать так не судьба : Код temp = rand() * 20UL; temp >>= 16; ?
|
|
|
|
|
Apr 20 2009, 08:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(singlskv @ Apr 20 2009, 12:07)  а написать так не судьба : Код temp = rand() * 20UL; temp >>= 16; ? да в общем-то, что было ранее написано - то я и протестировал... но и этот вариант немногим лучше: 1688 и 1532 такта - выигрыш 9,2% - о разах речь просто не идет! а вот на счет распределения сомнения появляются...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Apr 20 2009, 12:06
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(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 вроде уже неоднократно обсуждали
|
|
|
|
|
Apr 25 2009, 11:57
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 14-04-09
Пользователь №: 47 685

|
мне просто нужно было от 0-9 причем времени вагон.... зато скока интерестного узнал
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|