LINUX.ORG.RU

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


0

0

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

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

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

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

Правильнее использовать srand в начале работы программы один раз и всё. Кстати можно писать time(0), аргумент вам ведь не нужен.

И ещё, rand() % MAXVAL, вообще говоря, не даёт равномерного распределения. Надо делать что-то вроде (float)rand() / RAND_MAX * MAXVAL

Legioner ★★★★★
()

А в чем проблема-то?

_Первый_ раз инициализируешься от time(), а потом просто прибавляешь единичку, например.

Другой вариант: вместо time() для srand() юзаешь gettimeofday(), от которой берешь tv_usec -- они и сами по себе достаточно случайны :)

Die-Hard ★★★★★
()

если вначале программы не хочешь вызывать srand, то можно сделать так

static int init = 0;
if (!init) {
	srand((unsigned long)time(0));
	init = 1;
}

Reset ★★★★★
()
Ответ на: комментарий от Legioner

> Правильнее использовать srand в начале работы программы один раз и всё. Кстати можно писать time(0), аргумент вам ведь не нужен.

Да, видимо так. Только как заставить её выполняться вначале? Засовывая в main() перед вызовом функций выполнения матрицы получаем ту же картину..

> И ещё, rand() % MAXVAL, вообще говоря, не даёт равномерного распределения. Надо делать что-то вроде (float)rand() / RAND_MAX * MAXVAL

Работает, но как отбросить дробную часть? И так, и эдак, но не получается. А тип матрицы должен быть нецелочисленный потому что потом придётся производить различные действия. Но входные данные естественно лучше целымИ, для наглядности...

Arceny ★★
() автор топика
Ответ на: комментарий от Legioner

З.Ы. В борландС 3.1 в котором нас тренируют всё проще, но использовать его прнципиально не жедаю.

Arceny ★★
() автор топика
Ответ на: комментарий от Reset

> если вначале программы не хочешь вызывать srand, то можно сделать так

Да, спасибо, помогло. Вообще-то нам на лекции давали подобный пример с использованием статической переменной для проверки - вызывалась ли ф-я ранее или нет, но я как-то не сообразил. Этот вариант заработал.

Arceny ★★
() автор топика
Ответ на: комментарий от Arceny

Matr[i][j] = (long) ( (double)rand() / (RAND_MAX) * MAXVAL );

Всё работает, вопрос снят...

Arceny ★★
() автор топика

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

Если нормальную, то рекомендую gsl.

dn2010 ★★★★★
()
Ответ на: комментарий от Arceny

> Работает, но как отбросить дробную часть? И так, и эдак, но не
> получается. А тип матрицы должен быть нецелочисленный потому что
> потом придётся производить различные действия. Но входные данные
> естественно лучше целымИ, для наглядности...

man 3 rand:

       In  Numerical Recipes in C: The Art of Scientific Computing (William H.
       Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New
       York:  Cambridge University Press, 1992 (2nd ed., p. 277)), the follow-
       ing comments are made:
              "If you want to generate a random integer between 1 and 10,  you
              should always do it by using high-order bits, as in

                     j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

              and never by anything resembling

                     j = 1 + (rand() % 10);

              (which uses lower-order bits)."

       Random-number  generation is a complex topic.  The Numerical Recipes in
       C book (see reference above) provides an excellent discussion of  prac-
       tical random-number generation issues in Chapter 7 (Random Numbers).

       For  a  more  theoretical  discussion  which also covers many practical
       issues in depth, please see Chapter 3 (Random  Numbers)  in  Donald  E.
       Knuth's  The Art of Computer Programming, volume 2 (Seminumerical Algo-
       rithms), 2nd ed.;  Reading,  Massachusetts:  Addison-Wesley  Publishing
       Company, 1981.

elzhov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.