Форум сайта python.su
Как я понял Python использует генерацию псевдослучайных чисел. Можно ли узнать конкретную формулу?
Т.е есть какой - то случайный базовый x он берется, если не ошибаюсь на основе системного времени по умолчанию, затем используется мат формула, дающая хаос. И на основе этого мы будем получать каждый раз новый абсолютно случайный x. Если не ошибаюсь стартовый х должен принадлежать множеству Мандельборта. Меня из всего этого интересует мат формула и алгоритм, который преобразует время в этот самый стартовый х. Гуглил, но не нашел…
Отредактировано nodochy (Окт. 30, 2020 15:47:00)
Офлайн
Попробуй начать копать с исходника модуля random. Насколько знаю, в линукс, в папке с библиотеками питона есть файлик random.py
Посмотри что у него внутри и копай далее.
Офлайн
nodochyПитон использует разные формулы. В том числе он может запрашивать случайные числа у операционной системы, которая их генерирует по-своему.
Можно ли узнать конкретную формулу?
nodochyДа хрень там используется. Но суть в том, что следующее число генерируется на основе предыдущего. Поэтому последовательность и называется псевдослучайной - по предыдущим числам можно угадать следующие.
Т.е есть какой - то случайный базовый x он берется, если не ошибаюсь на основе системного времени по умолчанию, затем используется мат формула, дающая хаос.
nodochyНе факт. И у этого мужика фамилия Мандельброт, а не Мандельборт.
Если не ошибаюсь стартовый х должен принадлежать множеству Мандельборта.
EXAMPLE
POSIX.1-2001 gives the following example of an implementation of rand() and
srand(), possibly useful when one needs the same sequence on two different
machines.
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned int seed) {
next = seed;
}
Отредактировано py.user.next (Окт. 30, 2020 18:58:27)
Офлайн
я правильно понимаю
в mysrand() мы присваеваем глобальную next
а в myrand() и происходит вся магия
тока чет не соображу как получается что то хотя бы минимально случайнопдобное?
лучше бы дергали бы из памяти мусор (ну там переполнение итд) оно как бы более хаотично что ли
Отредактировано AD0DE412 (Окт. 30, 2020 20:01:45)
Офлайн
AD0DE412Вот у меня 32 гига памяти, занято максимум 3. Я запускаю свою программу. Операционная система ей выделяет страницы памяти, которые с момента включения компьютера никакой другой программе еще не аллоцировались. Откуда программа возьмет мусор?
лучше бы дергали бы из памяти мусор (ну там переполнение итд) оно как бы более хаотично что ли
Офлайн
ну вроде бы в линуксе (при запуске) чето генерится и windows чет вроде того
деталей не знаю так краем уха выцеплялось т.е. там есть какая то область памяти занятая ‘мусором’
Отредактировано AD0DE412 (Окт. 30, 2020 20:51:54)
Офлайн
AD0DE412тут главное что служит источником ентропии, в линуксе это счётчик тактов процессора, в МС это текущее время, размер жёсткого диска, размер свободной памяти, и чего то еще там, я не помню всего , а у интеловского RDRAND шумы токов..
тока чет не соображу как получается что то хотя бы минимально случайнопдобное?
лучше бы дергали бы из памяти мусор (ну там переполнение итд) оно как бы более хаотично что ли
[code python][/code]
Офлайн
а дошло в seed идет значение ну всего этого. спсб
Офлайн
AD0DE412
ну вроде бы в линуксе (при запуске) чето генерится и windows чет вроде того деталей не знаю так краем уха выцеплялось т.е. там есть какая то область памяти занятая ‘мусором’
Офлайн
> тока чет не соображу как получается что то хотя бы минимально случайнопдобное?
Есть много псевдослучайных алгоритмов. Например LCG, его реализацию как раз и привёл py.user.next. Вот его реализация на python-е
a, b, m = 22695477, 1, 4294967296 def lcg(): if lcg.x > 0: lcg.x = (lcg.x*a+b)%m return lcg.x lcg.x = 3 r = lcg() while r > 0: print(lcg())
Отредактировано Rodegast (Окт. 30, 2020 23:38:12)
Офлайн