Làm cách nào để tạo các số ngẫu nhiên không lặp lại ở dạng số?
list = np.random.random_integers(20,size=(10))
Làm cách nào để tạo các số ngẫu nhiên không lặp lại ở dạng số?
list = np.random.random_integers(20,size=(10))
Câu trả lời:
numpy.random.Generator.choice
đưa ra một replace
đối số để lấy mẫu mà không cần thay thế:
from numpy.random import default_rng
rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
Nếu bạn đang Generator
sử dụng NumPy trước 1.17, không có API, bạn có thể sử dụng random.sample()
từ thư viện chuẩn:
print(random.sample(range(20), 10))
Bạn cũng có thể sử dụng numpy.random.shuffle()
và cắt lát, nhưng cách này sẽ kém hiệu quả hơn:
a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]
Cũng có một replace
đối số trong numpy.random.choice
hàm kế thừa , nhưng đối số này được triển khai không hiệu quả và sau đó không hiệu quả do đảm bảo tính ổn định của dòng số ngẫu nhiên, vì vậy việc sử dụng nó không được khuyến khích. (Về cơ bản, nó thực hiện việc xáo trộn và cắt lát nội bộ.)
import random
?
random.sample(range(n), 10))
sẽ hiệu quả ngay cả đối với rất lớn n
, vì một range
đối tượng chỉ là một trình bao bọc nhỏ lưu trữ các giá trị bắt đầu, dừng và bước, nhưng không tạo danh sách đầy đủ các số nguyên. Trong Python 2, bạn có thể thay thế range
bằng xrange
để có được một hành vi tương tự.
Tôi nghĩ numpy.random.sample
bây giờ không hoạt động. Đây là cách của tôi:
import numpy as np
np.random.choice(range(20), 10, replace=False)
range(n)
(hoặc arange(n)
) như đối số đầu tiên của choice
, nó tương đương với chỉ truyền n
, ví dụ choice(20, 10, replace=False)
.
np.random.choice(a, size, replace=False)
tốc độ này rất chậm đối với dung lượng lớn a
- trên máy tính của tôi, khoảng 30 ms cho a = 1 triệu.
n
sử dụng numpy.random.Generator.choice
(bắt đầu với v1.17 NumPy)
Nhiều năm sau, một số thời gian để chọn 40000 trong số 10000 ^ 2 (Numpy 1.8.1, imac 2.7 GHz):
import random
import numpy as np
n = 10000
k = 4
np.random.seed( 0 )
%timeit np.random.choice( n**2, k * n, replace=True ) # 536 µs ± 1.58 µs
%timeit np.random.choice( n**2, k * n, replace=False ) # 6.1 s ± 9.91 ms
# https://docs.scipy.org/doc/numpy/reference/random/index.html
randomstate = np.random.default_rng( 0 )
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=False ) # 766 µs ± 2.18 µs
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=True ) # 1.05 ms ± 1.41 µs
%timeit random.sample( range( n**2 ), k * n ) # 47.3 ms ± 134 µs
(Tại sao lại chọn 40000 trong số 10000 ^ 2? Để tạo
ma trận scipy.sparse.random lớn
- sử dụng scipy 1.4.1 np.random.choice( replace=False )
, slooooow.)
Lời khuyên dành cho những người numpy.random.
Chỉ cần tạo một mảng có chứa phạm vi số được yêu cầu, sau đó trộn chúng bằng cách hoán đổi liên tục một dãy ngẫu nhiên với phần tử thứ 0 trong mảng. Điều này tạo ra một chuỗi ngẫu nhiên không chứa các giá trị trùng lặp.