2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Генерация случайных чисел на C/C++ стандартными методами
Сообщение27.09.2011, 12:50 
Аватара пользователя
Столкнулся со следующей проблемой. При генерации случайных чисел (язык C) получается неудовлетворительный результат — выходят последовательности вида N, N, N+n, N+n, N+2n, N+3n... Компилятор — gcc для 64-разрядной Windows.

Числа получаю с помощью функций rand() и srand():

Код:
srand(clock());
long int x = rand ();
/*Оба способа работают примерно одинаково*/
srand(time(NULL));
long int x = rand ();


Я что-то делаю неправильно, или это косяк компилятора? Можно ли придумать что-нибудь еще кроме инициализации системным временем?

Еще интересно было бы узнать про то, как генерировать случайные числами средствами STL C++.

 
 
 
 Re: Генерация случайных чисел на C/C++ стандартными методами
Сообщение27.09.2011, 16:47 
Аватара пользователя
Есть подозрения, что Вы инициализируете генератор многократно (вызываете повторно srand()) - сделайте один раз, а потом только rand()

 
 
 
 Re: Генерация случайных чисел на C/C++ стандартными методами
Сообщение28.09.2011, 09:01 
Попробуйте инициализировать так:
Код:
double dtime(){
   double t;
   struct timeval tv; struct timezone tz;
   gettimeofday(&tv, &tz);
   t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
   return t;
}

   double mx = (double) LONG_MAX, tt = dtime() * 1e6;
   srand48((long)(tt-mx*floor(tt/mx)));

Естественно, srand48 вызывается один раз. Далее: x = lrand48();

Функцией rand пользоваться не нужно, т.к. она возвращает int.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group