реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> WINAVR rand(), не работает RAND_MAX
singlskv
сообщение Apr 19 2009, 20:16
Сообщение #31


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Apr 19 2009, 23:50) *
Копия из копии... Это не IAR листинг.
Все. Финиш sad.gif ©zligo


Уважаемый Супермодератор!
Всем конечно понятно Ваше желание быть истиной в последней инстанции во всех
топиках в которых Вы принимаете участие.
Но я Вам не советую спорить ради спора... иначе Вы рискуете стать посмешищем...
удар то Вы не очень готовы держать(отказываемся почему-то от тестов ... smile.gif )
Ну типа научитесь уже хоть иногда признавать что Ваша первая мысль была ошибочной...
Это очень Вам поможет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2009, 20:29
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 19 2009, 20:45
Сообщение #33


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Apr 20 2009, 00:29) *
В данном конкретном случае я просто не имею времени вычитывать нечто дизассемблированное представленное вместо IAR листинга.
Вы знаете, я то же немного программирую по работе иногда...
и если я участвую в форуме и в конкретных топиках высказываю свое мнение,
я обычно готов его подтвердить листингом или еще как-то... доступно...
Цитата
Как не имею времени (и самое главное интереса по отношению к AVR) проделать этот хоть и простой зксперимент. То, что в AVR/IAR получение остатка от деления реализовано действительно громоздко, я увидел и запостил исходник. Пока для себя взял на заметку при реальной необходимости попробовать для AVR в реале.
Как сказали бы Вы как модератор, это все очевидно и обсуждалось тысячу раз и
"Moderator:
Просьба не загромождать основные ветки (в частности "AVR") форума простейшими вопросами." smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 20 2009, 05:59
Сообщение #34


Гуру
******

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



Цитата(singlskv @ Apr 19 2009, 23:45) *
"Moderator:
Просьба не загромождать основные ветки (в частности "AVR") форума простейшими вопросами." smile.gif

Вы не считаете первоначальный вопрос банальным?
Вы считаете, что первоначальный вопрос имеет хоть какое-то отношение к разделу AVR, куда его дважды запостил Автор?
Или на Вас просто слово "Модератор" действует, как красная тряпка?
P.S.
Moderator:
Вопросы риторические. Отвечать в форуме не надо. Если очень хочется - в личную почту. Ознакомлюсь по возврашению из командировки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 20 2009, 06:41
Сообщение #35


Профессионал
*****

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



вот ведь спорить любители smile.gif я провел тест за вас:
Код
#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%) biggrin.gif в общем, результат был ожидаемым, как zltigo и "предчувствовал" smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 20 2009, 08:07
Сообщение #36


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ARV @ Apr 20 2009, 10:41) *
выигрыш далеко не десятикратный, речь вообще не идет о целых разах (выигрыш 3%) biggrin.gif в общем, результат был ожидаемым, как zltigo и "предчувствовал" smile.gif

а написать так не судьба :
Код
    temp = rand() * 20UL;
    temp >>= 16;

?
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 20 2009, 08:22
Сообщение #37


Профессионал
*****

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



Цитата(singlskv @ Apr 20 2009, 12:07) *
а написать так не судьба :
Код
    temp = rand() * 20UL;
    temp >>= 16;
?
да в общем-то, что было ранее написано - то я и протестировал... но и этот вариант немногим лучше: 1688 и 1532 такта - выигрыш 9,2% - о разах речь просто не идет! а вот на счет распределения сомнения появляются...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 20 2009, 08:25
Сообщение #38


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ARV @ Apr 20 2009, 12:22) *
да в общем-то, что было ранее написано - то я и протестировал... но и этот вариант немногим лучше: 1688 и 1532 такта - выигрыш 9,2% - о разах речь просто не идет!
А теперь вычтите из каждого куска время работы rand(), тк нас сейчас интересует только эфективность %10
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 20 2009, 08:26
Сообщение #39


Профессионал
*****

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



Цитата(singlskv @ Apr 20 2009, 12:25) *
А теперь вычтите из каждого куска время работы rand(), тк нас сейчас интересует только эфективность %10
прежде приведите доказательства, что при вашем методе не искажается равномерность распределения чисел... иначе смысла говорить дальше просто нет...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 20 2009, 08:35
Сообщение #40


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ARV @ Apr 20 2009, 12:26) *
прежде приведите доказательства, что при вашем методе не искажается равномерность распределения чисел... иначе смысла говорить дальше просто нет...
Ну мы просто поделили rand() на 3276,8 равномерность при этом явно не страдает, раз
она не страдала при % 10
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 20 2009, 09:58
Сообщение #41


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Осталось только получить миллион нагенерированных значений и отдать на растерзание MATLABу с целью проверки статистики.
(В свое время искал генератор псевдослучайных чисел для AVR с более-менее равномерным распределением, проверял именно так.)


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 20 2009, 11:56
Сообщение #42


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(singlskv @ Apr 20 2009, 12:35) *
Ну мы просто поделили rand() на 3276,8 равномерность при этом явно не страдает, раз она не страдала при % 10
Я считаю что не стоит сильно запрягаться по поводу равномерности и эквивалентности этих операций.
Тут интересна реальная разница в скорости. Т.к. N%10 используется ну очень и очень часто и безотносительно rand().


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 20 2009, 12:06
Сообщение #43


дятел
*****

Группа: Свой
Сообщений: 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 вроде уже неоднократно обсуждали
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 21 2009, 21:23
Сообщение #44


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



А автору топика, если ему нужно только 0-9,и нужно быстро, стоит наверное остановиться на чем-то типа:
Код
volatile uint8_t result;
uint16_t s;

uint16_t irnd()
{
  return s = ((s * 0x3245) + 0x1B0D) & 0x7FFF;
}

int main(void)
{
  uint16_t tmp16;
  uint32_t tmp32;

  s = 1;
  tmp16 = irnd();
  tmp32 = ((uint32_t)tmp16 << 2) + tmp16;
  tmp16 = tmp32 >> 8;
  tmp16 <<= 2;
  result = tmp16 >> 8;

  return 0;
}
Go to the top of the page
 
+Quote Post
heburashka
сообщение Apr 25 2009, 11:57
Сообщение #45


Участник
*

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



мне просто нужно было от 0-9 причем времени вагон....

зато скока интерестного узнал rolleyes.gif
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 07:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016