Random, Как работает |
Random, Как работает |
SkIv |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Реальное имя: IVAN Репутация: 0 |
Уважаемые прогерры, скжите пожалуйста как устроен выбор случайных чисел в функции random.
|
Altair |
Сообщение
#2
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Используется таймер для получения случайного числа.
Таймер хранит текущее время в секундах... Длинное число, постоянно изменяется, из него можно брать псевдослучайные числа... Вот здесь есть информация про системный таймер и получение случайного числа. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Malice |
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Сможешь доказать, что делается именно так ? На примере TP.
|
Altair |
Сообщение
#4
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Ну нужно дизассемблировать код и посмотреть что там, это не сложно.
Сам принцип основан на таймере, а точная реализация не важна... -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Malice |
Сообщение
#5
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.)
|
Бродяжник |
Сообщение
#6
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
В Turbo C таймер используется только для randomize(), видимо и в ТР тоже. А так-то последовательность псевдослучайная, строго повторяемая. Причем период повторения вполне реально исчерпать. У меня был знакомый, который экспериментировал с теорией вероятности и теорией чисел. Так вот у него была прога, где использовался random из Турбо Си. И он мне однажды говорит: "Слушай, а как оно случайные числа генерит? Я ему задал сгенерить матрицу MxN, потом удалил повторяющиеся строки, вышло S строк. Потом я ему задал матрицу Mx(2*N), удалил повторения - что такое! Опять S строк осталось, и при чем те же самые, что и в первый раз!" (К этому надо добавить. что матрицы у него были строк эдак на двести-триста тысяч и более).
Кстати, с наступающим всех! |
SkIv |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Реальное имя: IVAN Репутация: 0 |
Так все дело в таймере, а тогда как определяется величина этого таймера
Сообщение отредактировано: SkIv - |
Altair |
Сообщение
#8
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата И всетаки ? Чтобы не быть голословным, так сказать. А так можно сказать, что рандом основан на какой нибудь хитрой функции, зависящей от предыдущего числа (ну умножили на что-то, сдвинули и т.п.) А вполне возможно что каждое следующее зависит от предыдущего какая разница? Суть в том, что первое число все равно с таймера возьмется. Так или иначе random основан на таймере. И что значит голословным? Я кинул ссылку на статью... -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Malice |
Сообщение
#9
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
А как быть с этим утверждением:
Цитата Используется таймер для получения случайного числа. Таймер хранит текущее время в секундах... Длинное число, постоянно изменяется, из него можно брать псевдослучайные числа... ? Здесь не про первое число, а про все. Суть в том, что первое число все равно с таймера возьмется. Так или иначе random основан на таймере. Если не вызывать randomize, то даже первое число никак таймера не коснется. И что значит голословным? Я кинул ссылку на статью... Статья про то, как с помощь таймера сделать рандом. Но не говорящая, что именно таким способом работает стандартная функция Random. Сообщение отредактировано: Malice - |
arhimag |
Сообщение
#10
|
Знаток Группа: Пользователи Сообщений: 424 Пол: Мужской Репутация: 2 |
Используйте поиск, мне вольво кидал ссылки на функции рандома
-------------------- Чего хочет женщина – того хочет Бог
|
Altair |
Сообщение
#11
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Malice, я не собираюсь с тобой спорить, автор темы получит две версии и сам разберется, если ему это необходимо.
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Malice |
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Хорошо, ты прав, спорить не надо. Но одна конкретная функция не может работать 2-мя способами, поэтому я приведу небольшой пример, на этом и покончим
my_rnd.pas ( 826 байт ) Кол-во скачиваний: 525 Проверено на TP, на других компиляторах может быть чуть иначе. Сообщение отредактировано: Malice - |
xds |
Сообщение
#13
|
N337 Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: 26 |
Очередное число псевдослучайной последовательности Random получает на основе предыдущего, взятого из переменной System.RandSeed. Начальное значение RandSeed - 0. Его можно изменить на "случайное" с помощью вызова Randomize, который просто записывает в RandSeed значение, возвращённое int 21h/ah = 2Ch.
-------------------- The idiots are winning.
|
Bokul |
Сообщение
#14
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
xds, откуда такая инфа? Исходники копал?
-------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Lapp |
Сообщение
#15
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
xds, откуда такая инфа? Исходники копал? Bokul, это все совсем не секрет. Например, есть в том "Иллюстрированном самоучителе по Турбо Паскалю", ссылку на который я кидал (Приложение 4, модуль System). Malice, спасибо за пример. Еще интересно бы разобраться, как работает вызов без параметра.. Мне кажется, текущий вопрос можно немного трансформировать так: 1. Оценить качество стандартного ГСЧ. 2. Высказать предложения по его улучшению. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Bokul |
Сообщение
#16
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
Я не о RandSeed (о ней еще Malice писал в подобной теме ), я обо этом: int 21h/ah = 2Ch..
P.S. Кстати почему тема в свободном? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Lapp |
Сообщение
#17
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
я обо этом: int 21h/ah = 2Ch.. Ну, это легко додумать, учитывая информацию об обращении к таймеру (то самое руководство, Приложение 4, модуль System, Процедуры и функции). P.S. Кстати почему тема в свободном? А просто модератор Свободного мышей не ловит.. )) Или чтоб спецы губу не раскатывали на увеличение своего количества полезных мессаджей.. )))) -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Malice |
Сообщение
#18
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Malice, спасибо за пример. Да не за что. Хотел просто вырезать кусок из дизасма, а потом причесал, а он возьми, да заработай Цитата Еще интересно бы разобраться, как работает вызов без параметра.. Здесь тоже все просто: кроме функции random есть еще 2: Random_real и random_extended, вызываются в зависимости от использования (extended) или не использования сопроцессора. Цитата Мне кажется, текущий вопрос можно немного трансформировать так: 1. Оценить качество стандартного ГСЧ. 2. Высказать предложения по его улучшению. Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше |
Malice |
Сообщение
#19
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Ну это надо выяснить через какой период повторится randseed, чем ближе к Dword - тем лучше Проверил - повторился ровно через Dword, т.е. $FFFFFFFF. Теперь знаю точно чему равен период повторения и что равновероятно все. "Перемешаны" только числа не очень хорошо, как улучшить - хз.. |
SkIv |
Сообщение
#20
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Реальное имя: IVAN Репутация: 0 |
Поспрашивал у знакомых и один мне выдал такую формулу r(i)=(r(i+1)*a+c)/m, где a,c,m константы и подбираются самостоятельно (около 2e16) , а первое число берется из какого либо системного показателя.
|
Текстовая версия | 10.09.2024 8:28 |