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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> WINAVR rand(), не работает RAND_MAX
heburashka
сообщение Apr 19 2009, 14:49
Сообщение #1


Участник
*

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



Здравствуйте.

Пытаюсь заставить rand() генерить в узком диапазоне 0-9

выставлял RAND_MAX 0b00001001

в пректе и в <stdlib.h>

не работает.

help


спасибо.

Сообщение отредактировал heburashka - Apr 19 2009, 14:54
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2009, 15:11
Сообщение #2


Гуру
******

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



Цитата(heburashka @ Apr 19 2009, 17:49) *
Пытаюсь заставить rand()...

Не надо заставлять. Просто прочитайте описание rand() в любой из книжек.
value = rand() % 10;
Moderator:
Просьба не загромождать основные ветки (в частности "AVR") форума простейшими вопросами.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
heburashka
сообщение Apr 19 2009, 15:33
Сообщение #3


Участник
*

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



Цитата(zltigo @ Apr 19 2009, 18:11) *
Не надо заставлять. Просто прочитайте описание rand() в любой из книжек.
value = rand() % 10;
Moderator:
Просьба не загромождать основные ветки (в частности "AVR") форума простейшими вопросами.



уважаемый модератор, мой вопрос задан поскольку механизмы описанные в литературе не работают.

под "заставить" подразумевается получить результат в соответствии с механизмом работы, а не то что вы подумали....

value = rand() % 10;

это предложенный вариант решения ?

в документации нет ничего подобного.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 19 2009, 15:35
Сообщение #4


дятел
*****

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



Цитата(zltigo @ Apr 19 2009, 19:11) *
value = rand() % 10;
Очень не эфективно...
Надо как-нить так:
Код
  value = rand();
  value = (value & 0x0F) > 9 ? (value - 10) : value;

раз в 10-20 быстрее...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2009, 15:40
Сообщение #5


Гуру
******

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



Цитата(heburashka @ Apr 19 2009, 18:31) *
получить результат в соответствии с механизмом работы, а не то что вы подумали....

Вот именно с этим самым "механизмом" Вам и следует прежде всего ознакомиться, ибо он работает, "как описано в литературе". А "что вы подумали", залезть и подделать цифирки в системном заголовочном файле, которые дают программисту информацию о дианазоне генерирумых rand() чисел, то это уже чисто Ваши проблемы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
heburashka
сообщение Apr 19 2009, 15:41
Сообщение #6


Участник
*

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



Цитата(singlskv @ Apr 19 2009, 18:35) *
Очень не эфективно...
Надо как-нить так:
Код
  value = rand();
  value = (value & 0x0F) > 9 ? (value - 10) : value;

раз в 10-20 быстрее...


спасибо.

не понятно почему через rand_max не работает.....

не подскажете?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2009, 15:42
Сообщение #7


Гуру
******

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



Цитата(heburashka @ Apr 19 2009, 18:33) *
это предложенный вариант решения ?

Один из - канонический, так сказать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
heburashka
сообщение Apr 19 2009, 15:44
Сообщение #8


Участник
*

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



Цитата(zltigo @ Apr 19 2009, 18:40) *
Вот именно с этим самым "механизмом" Вам и следует прежде всего ознакомиться, ибо он работает, "как описано в литературе". А "что вы подумали", залезть и подделать цифирки в системном заголовочном файле, которые дают программисту информацию о дианазоне генерирумых rand() чисел, то это уже чисто Ваши проблемы.



дык мне и нужен диапазон 0-9 ... ?


RAND_MAX что то другое задает ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2009, 15:46
Сообщение #9


Гуру
******

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



Цитата(heburashka @ Apr 19 2009, 18:41) *
не понятно почему через rand_max не работает.....

Потому, что НЕ ДОЛЖЕН он работать в соответствии с Вашими фантазиями sad.gif. Перечитайте пост №5.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
heburashka
сообщение Apr 19 2009, 15:47
Сообщение #10


Участник
*

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



Цитата(heburashka @ Apr 19 2009, 18:44) *
дык мне и нужен диапазон 0-9 ... ?


RAND_MAX что то другое задает ?




проверил rand() % 10 - работает.

??? RAND_MAX что то другое задает ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2009, 15:48
Сообщение #11


Гуру
******

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



Цитата(heburashka @ Apr 19 2009, 18:44) *
RAND_MAX что то другое задает ?

Читайте по буквам еще раз - он вообще ничего не задает - он информирует.
Может Вы еще хотите подделав пару чисел с заголовочных файлах сделать из Вашего AVR 64-битный процессор? Подделать - легко, только ведь "работать" тоже не будет.
Системные заголовочные файлы вообще-то НИКОГДА править нельзя, ну если,конечно Вы не собираетесь после этого пересобрать компилятор/библилиотеки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 19 2009, 15:53
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(heburashka @ Apr 19 2009, 18:41) *
не понятно почему через rand_max не работает.....
Потому что RAND_MAX никак не влияет и не может влиять на работу библиотечной функции rand(). Через эту константу разработчики библиотеки сообщают ее пользователю, в каком диапазоне функция генерит свой результат. Повлиять на генерируемый функцией результат вы можете, изменив исходный код функции и перекомпилировав библотеку. А вот привести полученный от нее результат к интересующему вас диапазону вполне возможно. Пример - код zltigo. 

Цитата(singlskv @ Apr 19 2009, 18:35) *
Надо как-нить так:
Код
 value = rand();
  value = (value & 0x0F) > 9 ? (value - 10) : value;
раз в 10-20 быстрее...
Быстрее будет, но вот о нормальном распределении полученных значений можно забыть.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
heburashka
сообщение Apr 19 2009, 15:53
Сообщение #13


Участник
*

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



Цитата(zltigo @ Apr 19 2009, 18:46) *
Потому, что НЕ ДОЛЖЕН он работать в соответствии с Вашими фантазиями sad.gif. Перечитайте пост №5.



У меня нет фантазий на эту тему и на тему "заставить", у меня есть описание функции:

Возвращает псевдослучайное число в диапазоне от 0 до RAND_MAX.... и мне непонятно почему не работает...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2009, 15:56
Сообщение #14


Гуру
******

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



Цитата(heburashka @ Apr 19 2009, 18:53) *
...и мне непонятно почему не работает...

Все. Финиш sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 19 2009, 16:00
Сообщение #15


дятел
*****

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



Цитата(heburashka @ Apr 19 2009, 19:41) *
не понятно почему через rand_max не работает.....

не подскажете?

Попробую подсказать...
rand принципиально рассчитан на диапазон 0 - 2^N
это связанно с тем что нужно пробегать ВСЕ значения в этом диапазоне.
10 явно не подходит...

вот Вам реализация rand под WinAVR:
CODE

static int
do_rand(unsigned long *ctx)
{
#ifdef USE_WEAK_SEEDING
/*
* Historic implementation compatibility.
* The random sequences do not vary much with the seed,
* even with overflowing.
*/
return ((*ctx = *ctx * 1103515245L + 12345L) %
((unsigned long)RAND_MAX + 1));
#else /* !USE_WEAK_SEEDING */
/*
* Compute x = (7^5 * x) mod (2^31 - 1)
* wihout overflowing 31 bits:
* (2^31 - 1) = 127773 * (7^5) + 2836
* From "Random number generators: good ones are hard to find",
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.
*/
long hi, lo, x;

x = *ctx;
/* Can't be initialized with 0, so use another value. */
if (x == 0)
x = 123459876L;
hi = x / 127773L;
lo = x % 127773L;
x = 16807L * lo - 2836L * hi;
if (x < 0)
x += 0x7fffffffL;
return ((*ctx = x) % ((unsigned long)RAND_MAX + 1));
#endif /* !USE_WEAK_SEEDING */
}


int
rand_r(unsigned long *ctx)
{
return do_rand(ctx);
}


static unsigned long next = 1;

int
rand(void)
{
return do_rand(&next);
}

void
srand(unsigned int seed)
{
next = seed;
}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 14:54
Рейтинг@Mail.ru


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