2015-12-14 2 views
0

У меня есть скрипт python, который использует как random.Random, так и random.SystemRandom. Я использую объект SystemRandom для посева объекта Random. Значения из объекта Random используются в симуляции, и начальное значение печатается, чтобы пользователь мог воспроизвести результаты.Почему getrandbits() никогда не генерирует отрицательные числа?

Однако я заметил, что с любым из них, если я вызываю getrandbits (64), он никогда не отображает число как отрицательное. Это всегда положительное целое число.

Я ожидал бы, учитывая случайность, что близко к 50% времени он произведет отрицательное значение (установив самый левый бит на 1).

Почему мои прогнозы неверны?

Моя реализация:

sr = random.SystemRandom() 
seed = sr.getrandbits(64) 
seedgen = random.Random(seed) 
... 
seedgen.getrandbits(64) 
+0

Насколько велика C 'long' в вашей системе? –

+0

@MadPhysicist 8 байт. – Anro

ответ

1

Python ИНТ не ограничиваются до 64 бит. Они получают повышение на длительность Python (произвольная точность)

+1

Я вижу в интерактивной подсказке, они действительно прилагаются к L. Итак, означает ли это, что вместо того, чтобы когда-либо иметь отрицательное значение, точность только увеличивается, поэтому она всегда остается положительной? – Anro

+1

Да, это правильно. –

1

Встроенные целые числа Python становятся длинными (произвольные целые числа точности), если они больше 64-бит. Вы можете легко вычислить 2**150 в Python и получить результат 1427247692705959881058285969449495136382746624L (суффикс L означает, что тип Python long, который имеет неограниченную точность).

+1

Различие между 'int' и' long' лучше скрыто в Python3 –

+1

Однако, поскольку я генерирую только 64-разрядное число, я бы ожидал, что точность будет ровно 64 бит. Я вижу суффикс -L в интерактивном приглашении. Похоже, что произвольная точность не допускает отрицательных значений, если не установлен флаг. – Anro

+1

@Anro Нормальные ints являются 64-битными * подписанными * типами, но значение, генерируемое 'getrandbits()' всегда положительно. Поэтому, если вы попытаетесь сгенерировать более 63 бит (максимальное положительное значение, которое может быть сохранено в подписанном 64-битном целом), оно будет увеличено до Python. – C0deH4cker

Смежные вопросы