Помощь - Поиск - Пользователи - Календарь
Полная версия: Random
Форум «Всё о Паскале» > Другое > Свободное общение
SkIv
Уважаемые прогерры, скжите пожалуйста как устроен выбор случайных чисел в функции random.
Altair
Используется таймер для получения случайного числа.
Таймер хранит текущее время в секундах...
Длинное число, постоянно изменяется, из него можно брать псевдослучайные числа...

Вот здесь есть информация про системный таймер и получение случайного числа.
Malice
Сможешь доказать, что делается именно так ? На примере TP.
Altair
Ну нужно дизассемблировать код и посмотреть что там, это не сложно.
Сам принцип основан на таймере, а точная реализация не важна...
Malice
И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.)
Бродяжник
В Turbo C таймер используется только для randomize(), видимо и в ТР тоже. А так-то последовательность псевдослучайная, строго повторяемая. Причем период повторения вполне реально исчерпать. У меня был знакомый, который экспериментировал с теорией вероятности и теорией чисел. Так вот у него была прога, где использовался random из Турбо Си. И он мне однажды говорит: "Слушай, а как оно случайные числа генерит? Я ему задал сгенерить матрицу MxN, потом удалил повторяющиеся строки, вышло S строк. Потом я ему задал матрицу Mx(2*N), удалил повторения - что такое! Опять S строк осталось, и при чем те же самые, что и в первый раз!" (К этому надо добавить. что матрицы у него были строк эдак на двести-триста тысяч и более).
Кстати, с наступающим всех!
cook.gif
SkIv
Так все дело в таймере, а тогда как определяется величина этого таймера
Altair
Цитата
И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.)

А вполне возможно что каждое следующее зависит от предыдущего какая разница? Суть в том, что первое число все равно с таймера возьмется.
Так или иначе random основан на таймере.
И что значит голословным? Я кинул ссылку на статью...
Malice
А как быть с этим утверждением:
Цитата
Используется таймер для получения случайного числа.
Таймер хранит текущее время в секундах...
Длинное число, постоянно изменяется, из него можно брать псевдослучайные числа...

? Здесь не про первое число, а про все.

Цитата(Altair @ 30.12.2006 14:32) *

Суть в том, что первое число все равно с таймера возьмется.
Так или иначе random основан на таймере.

Если не вызывать randomize, то даже первое число никак таймера не коснется.

Цитата(Altair @ 30.12.2006 14:32) *

И что значит голословным? Я кинул ссылку на статью...

Статья про то, как с помощь таймера сделать рандом. Но не говорящая, что именно таким способом работает стандартная функция Random.
arhimag
Используйте поиск, мне вольво кидал ссылки на функции рандома
Altair
Malice, я не собираюсь с тобой спорить, автор темы получит две версии и сам разберется, если ему это необходимо.
Malice
Хорошо, ты прав, спорить не надо. Но одна конкретная функция не может работать 2-мя способами, поэтому я приведу небольшой пример, на этом и покончим smile.gif

Нажмите для просмотра прикрепленного файла
Проверено на TP, на других компиляторах может быть чуть иначе.
xds
Очередное число псевдослучайной последовательности Random получает на основе предыдущего, взятого из переменной System.RandSeed. Начальное значение RandSeed - 0. Его можно изменить на "случайное" с помощью вызова Randomize, который просто записывает в RandSeed значение, возвращённое int 21h/ah = 2Ch.
Bokul
xds, откуда такая инфа? Исходники копал? smile.gif
Lapp
Цитата(Bokul @ 31.12.2006 7:06) *

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

Bokul, это все совсем не секрет. Например, есть в том "Иллюстрированном самоучителе по Турбо Паскалю", ссылку на который я кидал (Приложение 4, модуль System).

Malice, спасибо за пример. Еще интересно бы разобраться, как работает вызов без параметра..

Мне кажется, текущий вопрос можно немного трансформировать так:
1. Оценить качество стандартного ГСЧ.
2. Высказать предложения по его улучшению.
Bokul
Я не о RandSeed (о ней еще Malice писал в подобной теме ), я обо этом: int 21h/ah = 2Ch..

P.S. Кстати почему тема в свободном? blink.gif
Lapp
Цитата(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
Цитата(Lapp @ 31.12.2006 6:46) *

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

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

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

Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше smile.gif
Malice
Цитата(Malice @ 31.12.2006 11:52) *

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

Проверил - повторился ровно через Dword, т.е. $FFFFFFFF. smile.gif Теперь знаю точно чему равен период повторения и что равновероятно все. "Перемешаны" только числа не очень хорошо, как улучшить - хз..
SkIv
Поспрашивал у знакомых и один мне выдал такую формулу r(i)=(r(i+1)*a+c)/m, где a,c,m константы и подбираются самостоятельно (около 2e16) , а первое число берется из какого либо системного показателя.
xds
Цитата(Bokul @ 31.12.2006 13:06) *

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

td
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.