crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в как получить случайное число в заданном диаппазоне?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 4.3.2009, 5:26
 
Цитата(fsMark @ 2.3.2009, 20:58) *
Для произвольного диапазона естественно:
(начальная точка) + (rand() / RAND_MAX)*(конечная точка - начальная точка)
видимо это самый лучший вариант, т.е. масштабирование результата и его смещение
kuler Дата 3.3.2009, 18:41
 
Цитата(Litkevich Yuriy @ 3.3.2009, 18:36) *
не будет,

ну дык а если приемник будет какой нить int64
Litkevich Yuriy Дата 3.3.2009, 18:36
 
Цитата(kuler @ 3.3.2009, 20:23) *
таким образом будет преодолен RAND_MAX
не будет, т.к. он равен максимальному значению int'а. Уменя диаппазон уже чем 0...RAND_MAX
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
Kagami Дата 3.3.2009, 11:23
  Главное не забыть один небольшой момент - rand() возвращает целое число. соответственно выражение rand()/RAND_MAX вернет _целое_ число (т.е. 0) :) Так что тут нужно явное преобразование типов: double(rand())/RAND_MAX
P.S. По крайней мере у меня так было с gcc 4.2.1, может сейчас что и изменилоcь
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 раз где-нибудь в начале программы и инициализировать чем-нибудь б/м случайным - текущим временем, например.

Ну или использовать более другие генераторы случайности. :)
kuler Дата 2.3.2009, 18:26
  ну во первых диапазон 99% будет ограниченным, а во вторых можно к примеру делать
return srand(RAND_MAX)*srand(RAND_MAX)*srand(RAND_MAX)
fsMark Дата 2.3.2009, 18:21
  А ты уверен что это будет нормальное распределение?.. мозги пухнут (конец рабочего дня) - немогу понять.
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, 17:58
 
Цитата(Litkevich Yuriy @ 2.3.2009, 17:42) *
как задать конечную точку в рантайме?


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



Для произвольного диапазона естественно:
(начальная точка) + (rand() / RAND_MAX)*(конечная точка - начальная точка)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 18:38