On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 346
Зарегистрирован: 11.04.07
Откуда: С Урала
Рейтинг: 2
ссылка на сообщение  Отправлено: 13.08.07 15:11. Заголовок: Рандомное число


Я то думал что рандомные числа генерятся на основе физических свойств процессора что в нем какие-то процессы протекают случайным образом а это оказывается по формуле считается:


если тебя обложили со всех сторон, как волка, то последнее что тебе остается сделать -- вконец оборзеть Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]


постоянный участник




Пост N: 347
Зарегистрирован: 11.04.07
Откуда: С Урала
Рейтинг: 2
ссылка на сообщение  Отправлено: 13.08.07 15:12. Заголовок: Re:


Те кто знает основы СИ поймут что здесь написано:
Функция получения случайных чисел
Сейчас мы покажем генератор псевдослучайных чисел. Это означает, что фактическая последовательность чисел предсказуема, но они разбросаны довольно равномерно в пределах возможного диапазона значений.
Схема начинает с числа, называемого "зерно". Она использует его для создания нового числа, которое становится новым зерном. Затем новое зерно можно использовать для создания более нового зерна и т.д. Чтобы эта схема работала, функция случайных чисел должна помнить зерно, которое она использовала при последнем вызове. Отметим, здесь нужно использовать статическую переменную!

/* Первая версия функции rand( )*/
rand( )
{
static int randx = 1;
randx = (randx * 25173 + 13849)%65536;
/* магическая формула */
return(randx);
}
Статическая переменная randx начинает со значения 1 и изменяется при помощи магической формулы каждый раз при вызове функции. Результатом в нашей системе является число, находящееся в диапазоне -32768 до 32767. Системы с разной длиной переменной типа int будут давать различные результаты.
Проверим работу функции при помощи этого простого драйвера:

/*драйвер 1 функции rand( ) */
main( )
{
int count;
for(count = 1; count <= 5; count++)
printf(" %d\n",rand( ));
}
Получим результат:

-26514
-4449
20196
-20531
3882
Эта последовательность чисел выглядит довольно случайной. Запустим драйвер еще раз. Теперь имеем

-26514
-4449
20196
-20531
3882
Получилось абсолютно то же самое. Это и есть псевдоэффект. Каждый раз, когда работает основная программа, мы начинаем с одного и того же значения зерна, равного 1. Можно обойти эту проблему, введя вторую функцию srand( ), которая позволяет вновь устанавливать зерно в начальное значение. Хитрость заключается в том, чтобы сделать randx внешней статической переменной, известной только функциям rand( ) и srand( ). Эти две функции нужно хранить в своем собственном файле и компилировать этот файл отдельно. Вот модификатор программы:

/* Файл для rand( ) и srand( ) */
static int randx = 1;
rand( )
{
randx = (randx * 25173 + 13849) % 65536;
return(randx);
}
srand(x)
unsigned x;
{
randx = x;
}
Используем другой драйвер:

/* драйвер 2 функции rand( ) */
main( )
{
int count;
int seed;
printf(" Введите свое значение зерна.\n");
scanf("%d", & seed);
srand(seed);
/* установите зерно в начальное значение */
for(count = 1; count <= 5; count++)
printf("%\n",rand( ));
}
Программа проработала один раз:

Введите свое значение зерна.

1
-26514
-4449
20196
-20531
3882
Используя значение 1 для переменной seed, получаем те же значения, что и прежде. Введем значение 2 и посмотрим, что получится:

2
23832
20241
-1858
-30417
-16204
Мы получили другую последовательность чисел.

если тебя обложили со всех сторон, как волка, то последнее что тебе остается сделать -- вконец оборзеть Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 15
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет