2009-11-01 65 views
9

Tôi đang cố tạo các giá trị số nguyên 64 bit ngẫu nhiên cho số nguyên và phao bằng Numpy, trong phạm vi toàn bộ các giá trị hợp lệ cho loại. Để tạo nổi 32-bit ngẫu nhiên, tôi có thể sử dụng:Số int64 và float64 ngẫu nhiên

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]) 

nhưng nếu tôi cố gắng và sử dụng đối với số lượng 64-bit, tôi nhận được

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]) 

Tương tự như vậy, đối với số nguyên, tôi có thể tạo ra thành công số nguyên ngẫu nhiên 32-bit:

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]) 

nhưng tôi không thành công cho số nguyên 64-bit:

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 

Hành vi này có được mong đợi hay tôi nên báo cáo những lỗi này là lỗi trong Numpy?

+1

là bạn có thể giải quyết mà cuối cùng? – Avision

Trả lời

0

Vấn đề có vẻ là phương pháp random_numbers chỉ mong đợi các số nguyên 32 bit.

Theo số ticket #555 hạt giống ngẫu nhiên hiện có thể là 64 bit kể từ phiên bản 1.1.0, tôi khuyên bạn nên tải xuống và cài đặt phiên bản mới nhất của NumPy từ here.

+0

Tôi đang sử dụng phiên bản svn mới nhất của số đã có sẵn – astrofrog

+0

Phiên bản nào nói nó là? – Soviut

+0

np .__ version__ cho 1.4.0.dev7539 – astrofrog

7

Đối với số nguyên bạn có thể tạo ra các số ngẫu nhiên 2 32 bit và kết hợp chúng:

a + (b << 32) 
+0

máy phát điện có thể được gắn nhãn. với máy phát điện tuần hoàn, a => b. –

+0

@ B.M. tại sao bạn thấy nó có thể thiên vị? có cách nào để vượt qua sự thiên vị? – Avision

2

Nó sẽ xuất hiện mã cho numpy.random.uniform() không tính cao thấp tại một số điểm, và Inf bắt nguồn từ đó.

Số nguyên được phân phối đồng đều dễ tạo như được hiển thị. Số điểm dấu chấm động được phân phối đồng đều sẽ yêu cầu suy nghĩ cẩn thận hơn.

Để báo cáo những điều kỳ quặc này là lỗi, tôi nghĩ bạn nên làm điều đó hoặc đăng thông báo vào danh sách gửi thư dự án. Bằng cách đó bạn sẽ ít nhất là tìm hiểu những gì các nhà phát triển nghĩ là hành vi hợp lý.

0

Tôi không tin nó đề cập đến cuộc gọi hạt giống ngẫu nhiên. Mã đơn giản nhất mà tôi nhận được rơi vào "Python int quá lớn để chuyển đổi thành C dài" là:

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

numpy. phiên bản = 1.5.0 đây

0

Tôi nhận ra đây là một câu hỏi rất cũ, nhưng có một câu trả lời mới bằng 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