IPB
ЛогинПароль:

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Random, Как работает
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: IVAN

Репутация: -  0  +


Уважаемые прогерры, скжите пожалуйста как устроен выбор случайных чисел в функции random.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Используется таймер для получения случайного числа.
Таймер хранит текущее время в секундах...
Длинное число, постоянно изменяется, из него можно брать псевдослучайные числа...

Вот здесь есть информация про системный таймер и получение случайного числа.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Сможешь доказать, что делается именно так ? На примере TP.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Ну нужно дизассемблировать код и посмотреть что там, это не сложно.
Сам принцип основан на таймере, а точная реализация не важна...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 206
Пол: Мужской

Репутация: -  3  +


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


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: IVAN

Репутация: -  0  +


Так все дело в таймере, а тогда как определяется величина этого таймера

Сообщение отредактировано: SkIv -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.)

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

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

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

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

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

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

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

Статья про то, как с помощь таймера сделать рандом. Но не говорящая, что именно таким способом работает стандартная функция Random.

Сообщение отредактировано: Malice -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 424
Пол: Мужской

Репутация: -  2  +


Используйте поиск, мне вольво кидал ссылки на функции рандома


--------------------
Чего хочет женщина – того хочет Бог
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Malice, я не собираюсь с тобой спорить, автор темы получит две версии и сам разберется, если ему это необходимо.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

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

Проверено на TP, на других компиляторах может быть чуть иначе.

Сообщение отредактировано: Malice -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Очередное число псевдослучайной последовательности Random получает на основе предыдущего, взятого из переменной System.RandSeed. Начальное значение RandSeed - 0. Его можно изменить на "случайное" с помощью вызова Randomize, который просто записывает в RandSeed значение, возвращённое int 21h/ah = 2Ch.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


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


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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

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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Я не о RandSeed (о ней еще Malice писал в подобной теме ), я обо этом: int 21h/ah = 2Ch..

P.S. Кстати почему тема в свободном? blink.gif


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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))))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

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

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

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

Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

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

Проверил - повторился ровно через Dword, т.е. $FFFFFFFF. smile.gif Теперь знаю точно чему равен период повторения и что равновероятно все. "Перемешаны" только числа не очень хорошо, как улучшить - хз..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: IVAN

Репутация: -  0  +


Поспрашивал у знакомых и один мне выдал такую формулу r(i)=(r(i+1)*a+c)/m, где a,c,m константы и подбираются самостоятельно (около 2e16) , а первое число берется из какого либо системного показателя.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 22:30
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name