Версия для печати темы
Форум «Всё о Паскале» _ Свободное общение _ Random
Автор: SkIv 30.12.2006 14:14
Уважаемые прогерры, скжите пожалуйста как устроен выбор случайных чисел в функции random.
Автор: Altair 30.12.2006 15:16
Используется таймер для получения случайного числа.
Таймер хранит текущее время в секундах...
Длинное число, постоянно изменяется, из него можно брать псевдослучайные числа...
Вот http://fort.stup.ac.ru/wmaster/books/frolov/bsp/V02/ch5.htm#ch5_6 есть информация про системный таймер и получение случайного числа.
Автор: Malice 30.12.2006 15:32
Сможешь доказать, что делается именно так ? На примере TP.
Автор: Altair 30.12.2006 15:37
Ну нужно дизассемблировать код и посмотреть что там, это не сложно.
Сам принцип основан на таймере, а точная реализация не важна...
Автор: Malice 30.12.2006 16:43
И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.)
Автор: Бродяжник 30.12.2006 17:23
В Turbo C таймер используется только для randomize(), видимо и в ТР тоже. А так-то последовательность псевдослучайная, строго повторяемая. Причем период повторения вполне реально исчерпать. У меня был знакомый, который экспериментировал с теорией вероятности и теорией чисел. Так вот у него была прога, где использовался random из Турбо Си. И он мне однажды говорит: "Слушай, а как оно случайные числа генерит? Я ему задал сгенерить матрицу MxN, потом удалил повторяющиеся строки, вышло S строк. Потом я ему задал матрицу Mx(2*N), удалил повторения - что такое! Опять S строк осталось, и при чем те же самые, что и в первый раз!" (К этому надо добавить. что матрицы у него были строк эдак на двести-триста тысяч и более).
Кстати, с наступающим всех!
Автор: SkIv 30.12.2006 17:56
Так все дело в таймере, а тогда как определяется величина этого таймера
Автор: Altair 30.12.2006 18:32
Цитата
И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.)
А вполне возможно что каждое следующее зависит от предыдущего какая разница? Суть в том, что первое число все равно с таймера возьмется.
Так или иначе random основан на таймере.
И что значит голословным? Я кинул ссылку на статью...
Автор: Malice 30.12.2006 18:45
А как быть с этим утверждением:
Цитата
Используется таймер для получения случайного числа.
Таймер хранит текущее время в секундах...
Длинное число, постоянно изменяется, из него можно брать псевдослучайные числа...
? Здесь не про первое число, а про все.
Цитата(Altair @ 30.12.2006 14:32)
Суть в том, что первое число все равно с таймера возьмется.
Так или иначе random основан на таймере.
Если не вызывать randomize, то даже первое число никак таймера не коснется.
Цитата(Altair @ 30.12.2006 14:32)
И что значит голословным? Я кинул ссылку на статью...
Статья про то, как с помощь таймера сделать рандом. Но не говорящая, что именно таким способом работает стандартная функция Random.
Автор: arhimag 30.12.2006 18:48
Используйте поиск, мне вольво кидал ссылки на функции рандома
Автор: Altair 30.12.2006 20:01
Malice, я не собираюсь с тобой спорить, автор темы получит две версии и сам разберется, если ему это необходимо.
Автор: Malice 30.12.2006 22:11
Хорошо, ты прав, спорить не надо. Но одна конкретная функция не может работать 2-мя способами, поэтому я приведу небольшой пример, на этом и покончим
my_rnd.pas ( 826 байт )
Кол-во скачиваний: 504
Проверено на TP, на других компиляторах может быть чуть иначе.
Автор: xds 31.12.2006 9:51
Очередное число псевдослучайной последовательности Random получает на основе предыдущего, взятого из переменной System.RandSeed. Начальное значение RandSeed - 0. Его можно изменить на "случайное" с помощью вызова Randomize, который просто записывает в RandSeed значение, возвращённое int 21h/ah = 2Ch.
Автор: Bokul 31.12.2006 10:06
xds, откуда такая инфа? Исходники копал?
Автор: Lapp 31.12.2006 10:46
Цитата(Bokul @ 31.12.2006 7:06)
xds, откуда такая инфа? Исходники копал?
Bokul, это все совсем не секрет. Например, есть в том "Иллюстрированном самоучителе по Турбо Паскалю", ссылку на который я кидал (Приложение 4, модуль System).
Malice, спасибо за пример. Еще интересно бы разобраться, как работает вызов без параметра..
Мне кажется, текущий вопрос можно немного трансформировать так:
1. Оценить качество стандартного ГСЧ.
2. Высказать предложения по его улучшению.
Автор: Bokul 31.12.2006 11:41
Я не о RandSeed (о ней еще Malice писал в http://forum.pascal.net.ru/index.php?showtopic=14868&hl= ), я обо этом: int 21h/ah = 2Ch..
P.S. Кстати почему тема в свободном?
Автор: Lapp 31.12.2006 11:55
Цитата(Bokul @ 31.12.2006 8:41)
я обо этом: int 21h/ah = 2Ch..
Ну, это легко додумать, учитывая информацию об обращении к таймеру (то самое руководство, Приложение 4, модуль System, Процедуры и функции).
Цитата(Bokul @ 31.12.2006 8:41)
P.S. Кстати почему тема в свободном?
А просто модератор Свободного мышей не ловит..
))
Или чтоб спецы губу не раскатывали на увеличение своего количества полезных мессаджей..
))))
Автор: Malice 31.12.2006 15:52
Цитата(Lapp @ 31.12.2006 6:46)
Malice, спасибо за пример.
Да не за что. Хотел просто вырезать кусок из дизасма, а потом причесал, а он возьми, да заработай
Цитата
Еще интересно бы разобраться, как работает вызов без параметра..
Здесь тоже все просто: кроме функции random есть еще 2: Random_real и random_extended, вызываются в зависимости от использования (extended) или не использования сопроцессора.
Цитата
Мне кажется, текущий вопрос можно немного трансформировать так:
1. Оценить качество стандартного ГСЧ.
2. Высказать предложения по его улучшению.
Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше
Автор: Malice 31.12.2006 16:54
Цитата(Malice @ 31.12.2006 11:52)
Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше
Проверил - повторился ровно через Dword, т.е. $FFFFFFFF.
Теперь знаю точно чему равен период повторения и что равновероятно все. "Перемешаны" только числа не очень хорошо, как улучшить - хз..
Автор: SkIv 1.01.2007 16:41
Поспрашивал у знакомых и один мне выдал такую формулу r(i)=(r(i+1)*a+c)/m, где a,c,m константы и подбираются самостоятельно (около 2e16) , а первое число берется из какого либо системного показателя.
Автор: xds 1.01.2007 20:26
Цитата(Bokul @ 31.12.2006 13:06)
xds, откуда такая инфа? Исходники копал?
td