Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Макрос для рэндома.


Автор: iddqd 24.12.2006, 22:40
Требуется написать макрос, который принимает два параметра (диапазон) и формирует случайным образом (функция стандартной библиотеки – 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)


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

Автор: comp 24.12.2006, 22:43
#define GetRandom(a, b) ((a) + ((double)(b) * rand() / (RAND_MAX + 1.0)))

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

это зачем? в примере же написано RAND_MAX, так и оставь

Автор: iddqd 24.12.2006, 22:49
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;
}


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

Автор: witex 24.12.2006, 22:51
ваабще я макросами не увлекаюсь! но ваабще нахождения дипозона выглядит так!
x = rand()%(max-min+1)+min

Автор: iddqd 24.12.2006, 22:54
witex, это тоже работает через раз. Даже с большими диапазонами.

Автор: Daevaorn 24.12.2006, 23:10
Цитата(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 );
}

Автор: iddqd 24.12.2006, 23:18
Daevaorn, ну это я так написал))
Есесна переходит на метку.

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

Автор: Daevaorn 24.12.2006, 23:23
Код

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

Автор: iddqd 24.12.2006, 23:31
Daevaorn, гениально.
+1 в репутацию и огромное спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)