crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> как получить случайное число в заданном диаппазоне?
Litkevich Yuriy
  опции профиля:
сообщение 2.3.2009, 17:42
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

как задать конечную точку в рантайме?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fsMark
  опции профиля:
сообщение 2.3.2009, 17:58
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

Спасибо сказали: 10 раз(а)




Репутация:   1  


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


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



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

Сообщение отредактировал fsMark - 2.3.2009, 17:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.3.2009, 18:02
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я вот так сделал:
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
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

Спасибо сказали: 10 раз(а)




Репутация:   1  


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

Сообщение отредактировал fsMark - 2.3.2009, 18:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 2.3.2009, 18:26
Сообщение #5


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


ну во первых диапазон 99% будет ограниченным, а во вторых можно к примеру делать
return srand(RAND_MAX)*srand(RAND_MAX)*srand(RAND_MAX)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 3.3.2009, 8:51
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Народ, вы чего! Идите в 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
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


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


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(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
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kuler @ 3.3.2009, 20:23) *
таким образом будет преодолен RAND_MAX
не будет, т.к. он равен максимальному значению int'а. Уменя диаппазон уже чем 0...RAND_MAX
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 3.3.2009, 18:41
Сообщение #10


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


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

ну дык а если приемник будет какой нить int64
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 8.12.2021, 20:59