Просмотр полной версии : рэндом- работа по алгоритму или поиск случайного?
procedure
07.01.2008, 14:52
В книге "php" (Крис Ньюмен) нашел одну интересную вещь. Здесь указывается что не бывает рэндомных значений. Все делается по алгоритму программы и если посчитать все с полным соответствием то можно предугадать резутльтат рэндомного значения.
Прямым текстом написано что не бывает воще в программировании случайных выражений все состоит строго по циклу.
1. Правду ли я прочитал?
2. (если правду) то можно ли как нибудь сделать вобще программу которая действительно будет высчитывать случайное число т.е. которое невозможно посчитать. ( я подразумеваю под тем что не человек будет например зниматся высчитыванием зарание значения рэндомного результата, а программа написанная для вычисления зарание предвиденного результата)
3. И все же, по какому алгоритму работает оператор random?
4. Хотелось бы ещё получить сведеня в целом о работе этого механизма и все что с ним связано, где его например можно применять? гже он полезен, а где можно обойтись и другим?
Обычно это число берется с времени... т.е. скажем считывается время (милесекунды) и это число и будет случайным.
procedure
07.01.2008, 14:56
а мне казалось что все делается намного проще, с помощью массивов...
хотя кто какой алгоритм придумает...
Sharingan
07.01.2008, 14:59
Абсолютно случайного числа сделать нельзя, все рандомы это псевдослучайные числа, предугадать ? ну в зависимости имееться ли ограничения в рандоме, если от 1 до 100 то можно, а вот больше, имхо практически невозможно. Даже граматно организованый рандом, можно сделать так что за большое время перебора нисовпадет ниодно значение...
Незнаю как в Пхп, но в Си алгоритм зависит от того как ты будешь этот рандом организовывать, тип данных, можно в зваисимости от времени и прочего.
procedure
07.01.2008, 15:04
Sharingan->ну в принципе, я почему то уверен что можно....даже допустим по этому же времени....мы пишем программу в которую тупо забиваем время, с которого будет выведено случайное число...и по этому же алгоритму мы вычисляем результат....
Так же допустим если мы запускаем простую функцию нахожденияслучайного числа в каком либо промежутке чисел, то это число можно предугадать заглянув уже в сам код C. понимаешь меня?
Здесь указывается что не бывает рэндомных значений. Все делается по алгоритму программы и если посчитать все с полным соответствием то можно предугадать резутльтат рэндомного значения.
ну вообще если только алгоритм работает в контексте одного процесса и не зависит от "жизненных" характеристик - время, температура и т.п.
>>3. И все же, по какому алгоритму работает оператор random?
математическому - в общем случае задается рекурентная последовательность с заданным первым элементом и большим периодом, то есть если выпало число x, то в следующий раз оно выпадет только через сравнительно большое число итераций. почитай кнута :)
(если правду) то можно ли как нибудь сделать вобще программу которая действительно будет высчитывать случайное число т.е. которое невозможно посчитать.
да можно, программно, но не алгоритмически.
Sharingan
07.01.2008, 15:09
Ну так, смотри несмотря на время, рандом может выдать тысячи значений, ну поставишь ты такой же алгоритм, и все равно оно выдаст не то значение что срандомизировало, ну если сомниваешься, попробуй написать программу...
procedure
07.01.2008, 15:12
а именно на php можно? Как ты себе представляешь эту программу?
procedure
07.01.2008, 15:13
Ну так, смотри несмотря на время, рандом может выдать тысячи значений, ну поставишь ты такой же алгоритм, и все равно оно выдаст не то значение что срандомизировало, ну если сомниваешься, попробуй написать программу...
очень большой процесс геморойа...лучше представить это все в теории и убедится..
>>4. Хотелось бы ещё получить сведеня в целом о работе этого механизма и все что с ним связано, где его например можно применять? гже он полезен, а где можно обойтись и другим?
Псевдослучайных чисел обычно хватает за глаза. В шифровании для генерации ключа обычно используются более сильные коды, например, Win PGP просит подвигать мышкой для генерации ключа и считывает ее перемещения
procedure
07.01.2008, 15:18
_Great_->вот это система мздец полный...эт когда веб мани кошелек регистрируешь применяется та система...я помню..=)
вобще можно вычеслить (вернее нужно в криптографии) многие шифры кодируются этими псевдослучайными числами, т.е для расшифрования сообщения нужно например вычислять последовательность псевдо случайных чисел, для этого нужно знать формулу генерации, определенные коэфициенты (в криптоанализе подрозумевается, что они известны изначально) и определенное начальное значение которое и является ключем шифрования, вопрос расшифровки заключается в знании этого начального значения
Рандом можно спокойно реализовать, просто кроме алгоритмической части должен быть доступ к внешним источникам, откуда будет получена информация.
простая формула:
Ki+1=(a*Ki+b) mod c
Ki-предыдущее случайное число
Ki+1-слудующее
с=4294967296 или 18446744073709551616
b-нечетное число
a mod 4=1
при этом период последовательности = с
Рандом можно спокойно реализовать, просто кроме алгоритмической части должен быть доступ к внешним источникам, откуда будет получена информация.
Ну не думаю, что прям уже так спокойно... Это получится уже аппаратный ГПСЧ с источником информационной энтропии, а такие приборы обычно используются военными и держатся в секрете.
ой, ксури, ты не знаешь даже что такое метод дихотомии, а тут про энтропию пишешь, про которую тут никто не слышал даже хихи:) вообще думается, чтобы обсуждать подобные темы на должном уровне нужно хотя бы кафедру соответствующую закончить, а так получается обмен своими теориями и умными словами.
Я знаю определение энтропии, знаю определение ГПСЧ. Этого достаточно, чтобы я мог упоминать о них. Про дихотомию, ты мне уже так мозг проебал, что прикинь, я прочитал, что это такое.
ИМХО
Чтоб был случайным тут нужен ИИ
Talisman
07.01.2008, 19:57
в бейсике если писать прогу с просто рандомом встроеным, то при каждом запуске она будет выдавать одну и ту же последовательность. ЧТобы этого избиэать в начале проги пишится initializate random - типо такой строчки, чтобы 1 число зависело от времени запуска.
2Moldman эхх чтобы последовательность была случайной алгоритма вообще не должно быть.. это не алгоритмическая задача.
4. Хотелось бы ещё получить сведеня в целом о работе этого механизма и все что с ним связано, где его например можно применять? гже он полезен, а где можно обойтись и другим?
Применений куча. Например в стрелялках, космос, и тебе нужно смоделировать эффект движение звезд ) Что б красиво все было. Вот тогда можешь написать что-то вроде star[i].x = WINDOW_WIDTH/2+rand()%WINDOW_WIDTH и у каждой звезды будет свое начальное положение. А еще каждому кораблю можно задать свою скорость и тд и тп. ))) Ех, вспомнил книги Андре Ламота по программированию компьютерных игр.. как я тащился от сабжа.. жаль, что забросил. Реально жаль (((
Генератор случайных чисел можно инициализировать начальным значением части оперативки.Если после выключения ПК она не обнуляется то кез его знает что там лежит.При каждом выключении просто генерить ещё один промежуток от куда брать числа для инициализации.
вот статья: http://www.xakep.ru/post/40115/default.asp
Ничего случайного в автоматической системе не бывает в принципе, по этому как бы не старались, без считывания данных из внешних датчиков достаточно длинную и достаточно "случайную" ПСП создать невозможно.
По поводу того, что схемы датчиков и генереторов ПСДП держатся в секрете военными - бред чистой воды. Таких схем полно на паяльнике и подобных ему ресурсах, а так же в соответствующей литературе.
Есть несколько простейших способов реализовать такой датчик без всяких схем и устройств. Они часто используются в криптографических пакетах типа PGP и всяческих хранилках паролей типа KeePass.
Первый и самый простой - это считывать значение счетчика комманд процессора при возниконовении какого-либо внешнего события, к примеру - нажатия на кнопку клавиатуры.
То же самое можно реализовать и с курсором мыши, которым ерзают по области с точками разного цвета (черный и белый чаще всего), когда курсор находится над точкой определенного цвета (скажем, белого) - считываем значение счетчика, над другими (черный) - ничего не делаем.
Таким образом получаем ПСП нужной длины. Но есть одно но - каждое следующее значение должно быть равновероятным, т.е. количество 0 и 1 в цепочке должно быть равным. Для достижения этого существуют специальные алгоритмы выравнивания вероятностей, которые благодаря своей простоте легко реализуются как программно, так и аппаратно.
Первый и самый простой - на выходе генератора брать не каждое значение, а результат выполнения операции XOR над двумя идущими подряд значениями. В таком случае возможны 4 результирующих комбинации - 00, 01, 10, 11. Суммарные вероятности пар (01 и 10) и (00 и 11) будут примерно равны, поэтому можно считать, что количество 0 и 1 в результате будет примерно равно.
Этот способ можно еще более улучшить, отбросив пары 00 и 11 как запрещенные, тогда мы имеем дело с практически равноверояно появляющимися парами 01 и 10, при этом на выход выдаем первый (или второй - на выбор разработчика) разряд пары.
Единственныйи и самый существенный недостаток этих методов - двухкратное замедление процесса генерации ПСП.
Так же можно высчитывать число в зависимости от текущей частоты процессора и его температуры (не обязательно эти характеристики и конкретный узел, есть масса других узлов, которые в подавляющем большинстве случаев присутствуют в ЦВМ). То бишь брать постоянно меняющиеся характеристики каких-либо присутствующих устройств, не подключая ничего дополнительно. Конечно это не сравнится с устройством спец. для этого заточенным, но все же как альтернатива имеет место быть.
Если ты знаешь алгоритм (генерации псевдослуч.числа) и входные данные (текущее время, таблицы, функции и т.д.),
то сможешь выполнить алгоритм и получить результат (псевдослучайное число)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot