генерация случайных чисел - rand()

Как сделать нормальную генерацию квазислучайных чисел?

Использую следующий код:

// Заполняет матрицу квазислучайными числами в диапазоне от 1 до MAXVAL
void RandomMatr(double (*Matr)[STRLEN], int n) {
int i,j;
time_t t;
srand((unsigned)time(&t));
for(i=0;i for(j=0; j Matr[i][j]= rand()%MAXVAL+1;
}

Вызывается 2 раза для разных матриц. И в обоих получаются ОДИНАКОВЫЕ
числа. Видимо, потому что time() выдаёт время в секундах, а не в
милисекундах, а оно достаточно мало. Если не использовать srand() то
вообще всегда получаются одни и те же числа. Посоветуйте чего нибудь,
чтоли....

Arceny

Функции

Функции псевдослучайных чисел по дефолту выдают всегда одну и ту же последовательность, начиная с запуска программы, чтобы было легко дебажить.
Чтобы это исправить, надо вызывать srand, но только один раз, в самом начале программы, а не перед тем, как понадобится новое случайное число.

Или например

Можно брать не time, а что нибудь более мелкое...
clock... ну типа того... хотя конечно srand(time) один раз в начале программы - нормально ИМХО.

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

Разобрались. на

Разобрались. на ЛОРе...

// Заполняет матрицу квазислучайными числами в диапазоне от 1 до MAXVAL
void RandomMatr(double (*Matr)[STRLEN], int n) {
   int i,j;
   static int init=0;
   if (!init) {
      srand((unsigned long)time(0));
      init = 1;
   }
   for(i=0;i<n;i++)
      for(j=0; j<n; j++)
         Matr[i][j] = (double) rand()/(RAND_MAX)*MAXVAL;
}

Не очень

Не очень красивое решение. Оно у тебя выполняет srand только при первом вызове функции.
Лучше поставить srand в самое начало main, а из этой процедуры убрать.

/dev/random

А чем Вас /dev/random urandom неустраивает?

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".