Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Макрос для рэндома. Без использования srand? 
V
    Опции темы
iddqd
Дата 24.12.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



Требуется написать макрос, который принимает два параметра (диапазон) и формирует случайным образом (функция стандартной библиотеки – rand, заголовочный файл <cstdlib>) число в заданном диапазоне.
Никак не могу разобраться с этим. В МСДН есть такой пример:
Код

  // Usually, you will want to generate a number in a specific range,
  // such as 0 to 100, like this:
  {
     int RANGE_MIN = 0;
     int RANGE_MAX = 100;
     for (i = 0;    i < 10; i++ )
      {
         int rand100 = (((double) rand() / 
                         (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
         printf( "  %6d\n", rand100);
      }
  }

Вроде то, что надо.
Пишу макрос:
Код

#define GetRandom(a, b) (((double) rand()/(double) b) * b + a)


Возвращает муть. Как быть?


--------------------
PM MAIL   Вверх
comp
Дата 24.12.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



#define GetRandom(a, b) ((a) + ((double)(b) * rand() / (RAND_MAX + 1.0)))
PM MAIL   Вверх
Daevaorn
Дата 24.12.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(iddqd @  24.12.2006,  23:40 Найти цитируемый пост)
(double) b

это зачем? в примере же написано RAND_MAX, так и оставь
PM MAIL WWW   Вверх
iddqd
Дата 24.12.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



comp, Ваш вариант не работает.

Мой: 
Код

#define GetRandom(a, b) (((double) rand()/(double) RAND_MAX) * b + a)
, тоже

Часто генерирует правильно, но, например, для 100 - 103 генерирует 109.

весь код такой:
Код

#define GetRandom(a, b) (((double) rand()/(double) RAND_MAX) * b + a)


int _tmain(int argc, _TCHAR* argv[])
{
Label:
    int a = 0;
    int b = 0;
    std::cout<<"Vvedite a i b:"<<std::endl;
    std::cin>>a>>b;
    int r = GetRandom(a, b);
    std::cout<<"Random: "<<r<<std::endl;
    char c;
    std::cout<<"Enter any char to exit"<<std::endl;
    std::cin>>c;
    goto Label;
    return 0;
}


Чтоб удобней было проверять.


--------------------
PM MAIL   Вверх
witex
Дата 24.12.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



ваабще я макросами не увлекаюсь! но ваабще нахождения дипозона выглядит так!
x = rand()%(max-min+1)+min
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
iddqd
Дата 24.12.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



witex, это тоже работает через раз. Даже с большими диапазонами.


--------------------
PM MAIL   Вверх
Daevaorn
Дата 24.12.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(iddqd @  24.12.2006,  23:49 Найти цитируемый пост)
 std::cout<<"Enter any char to exit"<<std::endl;

И как, выходит?

Добавлено @ 23:14 
Код

inline int random( int range_min, int range_max )
{
    return ( (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min );
}

PM MAIL WWW   Вверх
iddqd
Дата 24.12.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



Daevaorn, ну это я так написал))
Есесна переходит на метку.

Понимаете, дело в том, что мне надо именно макросом. Ну вот макросом и никак иначе :\


--------------------
PM MAIL   Вверх
Daevaorn
Дата 24.12.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Код

#define random( range_min, range_max ) ( (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min )

PM MAIL WWW   Вверх
iddqd
Дата 24.12.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



Daevaorn, гениально.
+1 в репутацию и огромное спасибо.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.