2016-05-27 4 views
2

Я пытаюсь генерации случайных чисел в Python 2.7 на 64-битной системе Windows, с помощью следующей строки кода:Python генератор случайных чисел numpy_rng.random_integers (1E10)) OverflowError

random_state=numpy_rng.random_integers(1e10) 

Но я набираюсь следующая ошибка.

OverflowError: Python int too large to convert to C long. 

со следующим следом обратно rand_num_generator = numpy.random.RandomState (random_state) Файл "mtrand.pyx", строка 618, в mtrand.RandomState. init (numpy \ random \ mtrand \ mtrand.c: 8275) Файл "mtrand.pyx", строка 654, в mtrand.RandomState.seed (numpy \ random \ mtrand \ mtrand.c: 8670) ValueError: Seed должно быть от 0 до 4294967295

+0

Я не уверен, что вы уже знаете это, но это не случайное целое, которое не может быть слишком большим, это семя. Есть ли какая-то конкретная причина, по которой вы используете это большое количество семян? – ayhan

+0

Извините, что вы правы своим семенем. На самом деле это код из сети, который я пытаюсь запустить в своей системе. Разделяет ли семя что-то еще, кроме заданного стартового значения случайного числа? – ATIF

+0

Нет, только начальное значение. Вы можете использовать другой номер, он не должен быть таким большим. – ayhan

ответ

1

Следующее должно работать, используя NumPy.

from numpy.random import randint 

randint(1e10) 
# 6073545190 

Вы также можете использовать встроенный в random.randint для выполнения тех же задач, с различиями между этим и функциями numpy.random.randint описаны here.

from random import randint 

randint(0, 1e10) 
# 7978154001 
+0

Я пробовал вышеупомянутый код, но все же я получаю ту же ошибку – ATIF

+0

Я пробовал вышеупомянутый код, но все же я получаю то же самое. Для второй строки кода он имеет следующую ошибку errorValueError: Seed должен быть между 0 и 4294967295 – ATIF

+0

@ATIF: Странно. Не могли бы вы обновить свой вопрос со всей трассировкой стека, пожалуйста? – 2Cubed

2

Макс целое число в вашем Питона:

import sys 

sys.maxint 
Out[61]: 2147483647 

или ок. 2.1e9. Это ограничение Windows. От this поста:

In their infinitive wisdom Microsoft has decided to make the 'long' C type always a 32 bit signed integer - even on 64bit systems.

Таким образом, вы не можете использовать random_integers с аргументами больше, чем это число. Вы можете использовать вместо этого трюка:

10 * np.random.random_integers(1e9) - np.random.choice(10) 
Out[62]: 3910179327L 

Подход @ 2Cubed с randint(0, 1e10) также должны работать, вызвать через randint питона успешно конвертировать int в long.

+0

@ Vadim. спасибо за ответ. Но извините, я не мог понять трюк, потому что диапазон все еще не 1e10 – ATIF

+0

Код был ОК, он дает целое число в 'range (1, 1e10 + 1)'. –

+0

Я пробовал трюк, но у него такая же ошибка – ATIF

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