Случайные числа int64 и float64 - PullRequest
9 голосов
/ 02 ноября 2009

Я пытаюсь сгенерировать случайные 64-битные целочисленные значения для целых чисел и чисел с помощью Numpy, во всем диапазоне допустимых значений для этого типа . Для генерации случайных 32-битных операций с плавающей запятой я могу использовать:

In [2]: np.random.uniform(low=np.finfo(np.float32).min,high=np.finfo(np.float32).max,size=10)
Out[2]: 
array([  1.47351436e+37,   9.93620693e+37,   2.22893053e+38,
        -3.33828977e+38,   1.08247781e+37,  -8.37481260e+37,
         2.64176554e+38,  -2.72207226e+37,   2.54790459e+38,
        -2.47883866e+38])

но если я попытаюсь использовать это для 64-битных чисел, я получу

In [3]: np.random.uniform(low=np.finfo(np.float64).min,high=np.finfo(np.float64).max,size=10)
Out[3]: array([ Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf])

Аналогично, для целых чисел я могу успешно генерировать случайные 32-битные целые числа:

In [4]: np.random.random_integers(np.iinfo(np.int32).min,high=np.iinfo(np.int32).max,size=10)
Out[4]: 
array([-1506183689,   662982379, -1616890435, -1519456789,  1489753527,
        -604311122,  2034533014,   449680073,  -444302414, -1924170329])

, но мне не удалось использовать 64-разрядные целые числа:

In [5]: np.random.random_integers(np.iinfo(np.int64).min,high=np.iinfo(np.int64).max,size=10)
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)

/Users/tom/tmp/<ipython console> in <module>()

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.random_integers (numpy/random/mtrand/mtrand.c:6640)()

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:5813)()

OverflowError: long int too large to convert to int

Это ожидаемое поведение, или я должен сообщить об этом как об ошибках в Numpy?

Ответы [ 5 ]

7 голосов
/ 02 ноября 2009

Для целых чисел вы можете сгенерировать 2 32-битных случайных числа и объединить их:

a + (b << 32)
2 голосов
/ 02 ноября 2009

Может показаться, что код для numpy.random.uniform() в какой-то момент выполняет вычисление по максимуму и минимуму, и инфа происходит оттуда.

Равномерно распределенные целые числа легко генерируются, как было показано. Равномерно распределенные числа с плавающей запятой потребуют более тщательного обдумывания.

Что касается сообщения об этих странностях как об ошибках, я думаю, вы должны сделать это или опубликовать сообщение в списке рассылки проекта. Таким образом, вы по крайней мере узнаете, что разработчики считают разумным поведением.

0 голосов
/ 21 декабря 2017

Я понимаю, что это очень старый вопрос, но в Python есть новый ответ 3.6.3:

Python 3.6.3 |Anaconda, Inc.| (default, Oct  6 2017, 12:04:38) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> import sys
>>> sys.maxsize
9223372036854775807
>>> np.random.randint(sys.maxsize)
8550528944245072046
0 голосов
/ 30 октября 2011

Я не верю, что это относится к случайному начальному вызову. Простейший код, который попадает в «Python int, слишком большой, чтобы преобразовать в C long»:

x = numpy.random.random_integers(2**64,size=(SIZE,)).astype(numpy.uint64)

numpy. версия = 1.5.0 здесь

0 голосов
/ 02 ноября 2009

Кажется, проблема в том, что метод random_numbers ожидает только 32-разрядные целые числа.

Согласно тикету # 555 случайные начальные числа теперь могут быть 64-битными начиная с версии 1.1.0. Я предлагаю загрузить и установить последнюю версию NumPy из здесь .

...