Найти - Пользователи
Полная версия: Генерация случайных чисел.
Начало » Python для новичков » Генерация случайных чисел.
1 2
nodochy
Как я понял Python использует генерацию псевдослучайных чисел. Можно ли узнать конкретную формулу?
Т.е есть какой - то случайный базовый x он берется, если не ошибаюсь на основе системного времени по умолчанию, затем используется мат формула, дающая хаос. И на основе этого мы будем получать каждый раз новый абсолютно случайный x. Если не ошибаюсь стартовый х должен принадлежать множеству Мандельборта. Меня из всего этого интересует мат формула и алгоритм, который преобразует время в этот самый стартовый х. Гуглил, но не нашел…
Rafik
Попробуй начать копать с исходника модуля random. Насколько знаю, в линукс, в папке с библиотеками питона есть файлик random.py
Посмотри что у него внутри и копай далее.
py.user.next
nodochy
Можно ли узнать конкретную формулу?
Питон использует разные формулы. В том числе он может запрашивать случайные числа у операционной системы, которая их генерирует по-своему.

nodochy
Т.е есть какой - то случайный базовый x он берется, если не ошибаюсь на основе системного времени по умолчанию, затем используется мат формула, дающая хаос.
Да хрень там используется. Но суть в том, что следующее число генерируется на основе предыдущего. Поэтому последовательность и называется псевдослучайной - по предыдущим числам можно угадать следующие.

nodochy
Если не ошибаюсь стартовый х должен принадлежать множеству Мандельборта.
Не факт. И у этого мужика фамилия Мандельброт, а не Мандельборт.

Пример одной из сишных реализаций
man 3 rand
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;
}
AD0DE412
я правильно понимаю
в mysrand() мы присваеваем глобальную next
а в myrand() и происходит вся магия
тока чет не соображу как получается что то хотя бы минимально случайнопдобное?
лучше бы дергали бы из памяти мусор (ну там переполнение итд) оно как бы более хаотично что ли
FishHook
AD0DE412
лучше бы дергали бы из памяти мусор (ну там переполнение итд) оно как бы более хаотично что ли
Вот у меня 32 гига памяти, занято максимум 3. Я запускаю свою программу. Операционная система ей выделяет страницы памяти, которые с момента включения компьютера никакой другой программе еще не аллоцировались. Откуда программа возьмет мусор?
AD0DE412
ну вроде бы в линуксе (при запуске) чето генерится и windows чет вроде того
деталей не знаю так краем уха выцеплялось т.е. там есть какая то область памяти занятая ‘мусором’
PEHDOM
AD0DE412
тока чет не соображу как получается что то хотя бы минимально случайнопдобное?
лучше бы дергали бы из памяти мусор (ну там переполнение итд) оно как бы более хаотично что ли
тут главное что служит источником ентропии, в линуксе это счётчик тактов процессора, в МС это текущее время, размер жёсткого диска, размер свободной памяти, и чего то еще там, я не помню всего , а у интеловского RDRAND шумы токов..
AD0DE412
а дошло в seed идет значение ну всего этого. спсб
FishHook
AD0DE412
ну вроде бы в линуксе (при запуске) чето генерится и windows чет вроде того деталей не знаю так краем уха выцеплялось т.е. там есть какая то область памяти занятая ‘мусором’

Область памяти, безусловно, есть, только эта область памяти лежит за пределами адресного пространства программы, то есть из питончика ты эту пямять не прочитаешь, для этого надо просить операционную систему. А если уж просить о чем-то операционную систему, то наверное лучше попросить дать случайное число, а не хеш-сумму какой-то области памяти
Rodegast
> тока чет не соображу как получается что то хотя бы минимально случайнопдобное?

Есть много псевдослучайных алгоритмов. Например 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())

> лучше бы дергали бы из памяти мусор (ну там переполнение итд) оно как бы более хаотично что ли

Так только в спектрумах делали. В современных ОС для этих целей есть специальные псевдоустройства.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB