Как сделать нормальную генерацию квазислучайных чисел?
Использую следующий код:
// Заполняет матрицу квазислучайными числами в диапазоне от 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), аргумент вам ведь не нужен.
Да, видимо так. Только как заставить её выполняться вначале? Засовывая в main() перед вызовом функций выполнения матрицы получаем ту же картину..
> И ещё, rand() % MAXVAL, вообще говоря, не даёт равномерного распределения. Надо делать что-то вроде (float)rand() / RAND_MAX * MAXVAL
Работает, но как отбросить дробную часть? И так, и эдак, но не получается. А тип матрицы должен быть нецелочисленный потому что потом придётся производить различные действия. Но входные данные естественно лучше целымИ, для наглядности...
> если вначале программы не хочешь вызывать srand, то можно сделать так
Да, спасибо, помогло. Вообще-то нам на лекции давали подобный пример с использованием статической переменной для проверки - вызывалась ли ф-я ранее или нет, но я как-то не сообразил. Этот вариант заработал.
> Работает, но как отбросить дробную часть? И так, и эдак, но не
> получается. А тип матрицы должен быть нецелочисленный потому что
> потом придётся производить различные действия. Но входные данные
> естественно лучше целымИ, для наглядности...
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.