|
|
  |
WINAVR rand(), не работает RAND_MAX |
|
|
|
Apr 19 2009, 14:49
|
Участник

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

|
Здравствуйте.
Пытаюсь заставить rand() генерить в узком диапазоне 0-9
выставлял RAND_MAX 0b00001001
в пректе и в <stdlib.h>
не работает.
help
спасибо.
Сообщение отредактировал heburashka - Apr 19 2009, 14:54
|
|
|
|
|
Apr 19 2009, 15:11
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 19 2009, 15:33
|
Участник

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

|
Цитата(zltigo @ Apr 19 2009, 18:11)  Не надо заставлять. Просто прочитайте описание rand() в любой из книжек. value = rand() % 10; Moderator: Просьба не загромождать основные ветки (в частности "AVR") форума простейшими вопросами. уважаемый модератор, мой вопрос задан поскольку механизмы описанные в литературе не работают. под "заставить" подразумевается получить результат в соответствии с механизмом работы, а не то что вы подумали.... value = rand() % 10; это предложенный вариант решения ? в документации нет ничего подобного.
|
|
|
|
|
Apr 19 2009, 15:35
|
дятел
    
Группа: Свой
Сообщений: 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 быстрее...
|
|
|
|
|
Apr 19 2009, 15:40
|

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

|
Цитата(heburashka @ Apr 19 2009, 18:31)  получить результат в соответствии с механизмом работы, а не то что вы подумали.... Вот именно с этим самым "механизмом" Вам и следует прежде всего ознакомиться, ибо он работает, "как описано в литературе". А "что вы подумали", залезть и подделать цифирки в системном заголовочном файле, которые дают программисту информацию о дианазоне генерирумых rand() чисел, то это уже чисто Ваши проблемы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 19 2009, 15:41
|
Участник

Группа: Участник
Сообщений: 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 не работает..... не подскажете?
|
|
|
|
|
Apr 19 2009, 15:44
|
Участник

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

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

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

|
Цитата(heburashka @ Apr 19 2009, 18:44)  дык мне и нужен диапазон 0-9 ... ?
RAND_MAX что то другое задает ? проверил rand() % 10 - работает. ??? RAND_MAX что то другое задает ?
|
|
|
|
|
Apr 19 2009, 15:48
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 19 2009, 15:53
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Apr 19 2009, 15:53
|
Участник

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

|
Цитата(zltigo @ Apr 19 2009, 18:46)  Потому, что НЕ ДОЛЖЕН он работать в соответствии с Вашими фантазиями  . Перечитайте пост №5. У меня нет фантазий на эту тему и на тему "заставить", у меня есть описание функции: Возвращает псевдослучайное число в диапазоне от 0 до RAND_MAX.... и мне непонятно почему не работает...
|
|
|
|
|
Apr 19 2009, 16:00
|
дятел
    
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|