Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Свободное общение _ 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 строк осталось, и при чем те же самые, что и в первый раз!" (К этому надо добавить. что матрицы у него были строк эдак на двести-триста тысяч и более).
Кстати, с наступающим всех!
cook.gif

Автор: 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-мя способами, поэтому я приведу небольшой пример, на этом и покончим smile.gif

Прикрепленный файл  my_rnd.pas ( 826 байт ) Кол-во скачиваний: 352

Проверено на 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, откуда такая инфа? Исходники копал? smile.gif

Автор: Lapp 31.12.2006 10:46

Цитата(Bokul @ 31.12.2006 7:06) *

xds, откуда такая инфа? Исходники копал? smile.gif

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. Кстати почему тема в свободном? blink.gif

Автор: 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. Кстати почему тема в свободном? blink.gif

А просто модератор Свободного мышей не ловит.. smile.gif))
Или чтоб спецы губу не раскатывали на увеличение своего количества полезных мессаджей.. smile.gif))))

Автор: Malice 31.12.2006 15:52

Цитата(Lapp @ 31.12.2006 6:46) *

Malice, спасибо за пример.

Да не за что. Хотел просто вырезать кусок из дизасма, а потом причесал, а он возьми, да заработай smile.gif
Цитата
Еще интересно бы разобраться, как работает вызов без параметра..

Здесь тоже все просто: кроме функции random есть еще 2: Random_real и random_extended, вызываются в зависимости от использования (extended) или не использования сопроцессора.
Цитата
Мне кажется, текущий вопрос можно немного трансформировать так:
1. Оценить качество стандартного ГСЧ.
2. Высказать предложения по его улучшению.

Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше smile.gif

Автор: Malice 31.12.2006 16:54

Цитата(Malice @ 31.12.2006 11:52) *

Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше smile.gif

Проверил - повторился ровно через Dword, т.е. $FFFFFFFF. smile.gif Теперь знаю точно чему равен период повторения и что равновероятно все. "Перемешаны" только числа не очень хорошо, как улучшить - хз..

Автор: 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, откуда такая инфа? Исходники копал? smile.gif

td