Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ как получить случайное число в заданном диаппазоне?

Автор: Litkevich Yuriy 2.3.2009, 17:42

В Си это дело определяется следующими вещами:
int rand(void) - генератор
void srand(unsigned int) - стартовая точка
RAND_MAX - конечная точка

как задать конечную точку в рантайме?

Автор: fsMark 2.3.2009, 17:58

Цитата(Litkevich Yuriy @ 2.3.2009, 17:42) *
как задать конечную точку в рантайме?


Я делал примерно так:
(rand() / RAND_MAX)*(конечная точка)



Для произвольного диапазона естественно:
(начальная точка) + (rand() / RAND_MAX)*(конечная точка - начальная точка)

Автор: Litkevich Yuriy 2.3.2009, 18:02

я вот так сделал:

int yrandom(int minval, int maxval)
{
  int tmp;

    if (!minval) minval=1;
    if (!maxval) maxval=1;
    
    srand(minval);

    tmp = (maxval * rand()/RAND_MAX);

    qDebug() << "maxval=" << maxval
             << "minval=" << minval
             << "tmp=" << tmp;
    return tmp;
}

Автор: fsMark 2.3.2009, 18:21

А ты уверен что это будет нормальное распределение?.. мозги пухнут (конец рабочего дня) - немогу понять.

Автор: kuler 2.3.2009, 18:26

ну во первых диапазон 99% будет ограниченным, а во вторых можно к примеру делать
return srand(RAND_MAX)*srand(RAND_MAX)*srand(RAND_MAX)

Автор: Tonal 3.3.2009, 8:51

Народ, вы чего! Идите в help/man/google и читайте про то, что такое rand и srand.

rand - генератор псевдослучайной последовательности от 0 до RAND_MAX
Это значит, что он на основе некоторого текущего числа вычисляет следующее. При этом вычисленное число становится текущим.
srand - явно устанавливает текущее.

Т.е. код функция

int myrand() {
  srand(5);
  return rand();  
}

будет всегда возвращать одно и тоже число, а уж последовательность srand(RAND_MAX)*srand(RAND_MAX)*srand(RAND_MAX)
бессмысленна и не скомпилируется.

Для получения сколько-нибудь случайной последовательности, srand нужно вызывать 1 раз где-нибудь в начале программы и инициализировать чем-нибудь б/м случайным - текущим временем, например.

Ну или использовать более другие генераторы случайности. :)

Автор: Kagami 3.3.2009, 11:23

Главное не забыть один небольшой момент - rand() возвращает целое число. соответственно выражение rand()/RAND_MAX вернет _целое_ число (т.е. 0) :) Так что тут нужно явное преобразование типов: double(rand())/RAND_MAX
P.S. По крайней мере у меня так было с gcc 4.2.1, может сейчас что и изменилоcь

Автор: kuler 3.3.2009, 17:23

Цитата(Tonal @ 3.3.2009, 8:51) *
будет всегда возвращать одно и тоже число, а уж последовательность srand(RAND_MAX)*srand(RAND_MAX)*srand(RAND_MAX)
бессмысленна и не скомпилируется.

ну значит просто rand()*rand()*rand(), таким образом будет преодолен RAND_MAX

Автор: Litkevich Yuriy 3.3.2009, 18:36

Цитата(kuler @ 3.3.2009, 20:23) *
таким образом будет преодолен RAND_MAX
не будет, т.к. он равен максимальному значению int'а. Уменя диаппазон уже чем 0...RAND_MAX

Автор: kuler 3.3.2009, 18:41

Цитата(Litkevich Yuriy @ 3.3.2009, 18:36) *
не будет,

ну дык а если приемник будет какой нить int64

Автор: Litkevich Yuriy 4.3.2009, 5:26

Цитата(fsMark @ 2.3.2009, 20:58) *
Для произвольного диапазона естественно:
(начальная точка) + (rand() / RAND_MAX)*(конечная точка - начальная точка)
видимо это самый лучший вариант, т.е. масштабирование результата и его смещение

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)