C ++ случайное число между 2 числами сбрасывается - PullRequest
0 голосов
/ 09 декабря 2011

Функция ниже работает, но всегда возвращает одни и те же числа каждый раз, когда я запускаю программу.Есть ли способ генерировать случайные числа, которые отличаются каждый раз, когда я запускаю программу?

int getrand(int min,int max){
 int rnum = rand()%(max-min)+min;
 return rnum;  
} 

Ответы [ 6 ]

6 голосов
/ 09 декабря 2011

Вы можете использовать высококачественную стандартную библиотеку для генерации случайных чисел:

#include <random>

typedef std::mt19937 rng_type;
std::uniform_int_distribution<rng_type::result_type> udist(min, max);

rng_type rng;

int main()
{
  // seed rng first:
  rng_type::result_type const seedval = 4; // or implement a good get_seed()?
  rng.seed(seedval);

  rng_type::result_type random_number = udist(rng);

  return random_number;
}
2 голосов
/ 09 декабря 2011

попробуйте с этим:

/* initialize random seed: */
  srand ( time(NULL) );

где-нибудь, когда ваша программа запускается ( абсолютно не в вашей функции getrand ()).Это заставит генератор запускаться каждый раз с другим семенем.

1 голос
/ 09 декабря 2011

Генераторы псевдослучайных чисел должны быть "затравлены" перед их использованием;начальное число по умолчанию всегда одинаково, поэтому вы получаете одну и ту же последовательность.

Обычно вы используете что-то вроде srand(time(NULL)), но это не работает, если вы снова запустите программу в течение секунды.Также полезно использовать случайное число или два после посева, так как первые несколько значений сильно коррелируют с самим семенем.

1 голос
/ 09 декабря 2011

Похоже, вы забыли позвонить srand.

0 голосов
/ 09 декабря 2011

простое решение для рандомизации один раз будет:

int getrand(int min, int max) {
  static bool init = false;

  if (!init) {
    srand(time(NULL));
    init = true;
  }

  return rand()%(max-min)+min; 
}
0 голосов
/ 09 декабря 2011

Вам нужно инициировать семя.Проверьте srand.Кроме того, попробуйте повысить, если вы хотите:

boost::lagged_fibonacci607 base_prng(seed);
boost::variate_generator<boost::lagged_fibonacci607&,boost::uniform_smallint<> > prng(base_prng,boost::uniform_smallint<>(min,max))
...