2016-05-24 25 views
5

Làm thế nào để tạo ra một số nguyên ngẫu nhiên như với np.random.randint(), nhưng với một phân phối chuẩn xung quanh 0.Làm thế nào để tạo ra một phân phối chuẩn ngẫu nhiên của số nguyên

np.random.randint(-10, 10) lợi nhuận số nguyên với một bộ đồng phục rời rạc phân phối np.random.normal(0, 0.1, 1) lợi nhuận nổi với một phân phối chuẩn

Điều tôi muốn là một loại kết hợp giữa hai chức năng.

+10

Sự phân bố bình thường là liên tục theo định nghĩa, vì vậy câu trả lời cho câu hỏi này phụ thuộc vào cách bạn muốn tiết lộ nó. Một giải pháp có thể là lấy mẫu từ 'np.random.normal' và làm tròn kết quả thành một số nguyên. –

Trả lời

14

Một cách khác có thể để có được một bản phân phối rời rạc mà trông giống như phân phối chuẩn là để rút ra từ một phân phối đa thức nơi xác suất được tính từ phân bố chuẩn.

import scipy.stats as ss 
import numpy as np 
import matplotlib.pyplot as plt 

x = np.arange(-10, 11) 
xU, xL = x + 0.5, x - 0.5 
prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3) 
prob = prob/prob.sum() #normalize the probabilities so their sum is 1 
nums = np.random.choice(x, size = 10000, p = prob) 
plt.hist(nums, bins = len(x)) 

Ở đây, np.random.choice chọn số nguyên từ [-10, 10]. Xác suất chọn phần tử, nói 0, được tính bằng p (-0.5 < x < 0.5) trong đó x là biến ngẫu nhiên bình thường với giá trị trung bình bằng không và độ lệch chuẩn 3. Tôi chọn std. dev. như 3 vì cách p này (-10 < x < 10) là xấp xỉ bằng 1.

Kết quả trông như thế này:

enter image description here

+0

Tại sao bạn cộng và trừ 0,5 trong 'xL' và' xU'? –

+2

Để phân phối liên tục, P (x = 0) = 0 (điều này đúng cho bất kỳ số nào khác). Các probabiltiy được định nghĩa trong khoảng thời gian. Ở đây, để kết hợp xác suất với 0 (và với các số nguyên khác), tôi đã sử dụng khoảng thời gian (-0,5, 0,5) về cơ bản là vì câu hỏi được hỏi về số nguyên. Đối với 1, nó là (0,5, 1,5). – ayhan

+0

Tại sao bạn không dùng 'ss.norm.pdf (x, scale = 3)'? –

4

Có thể tạo phân phối tương tự từ Truncated Normal Distribution được làm tròn thành số nguyên. Dưới đây là ví dụ với số điện thoại truncnorm() của scipy.

import numpy as np 
from scipy.stats import truncnorm 
import matplotlib.pyplot as plt 

scale = 3. 
range = 10 
size = 100000 

X = truncnorm(a=-range/scale, b=+range/scale, scale=scale).rvs(size=size) 
X = X.round().astype(int) 

Hãy xem những gì nó trông giống như

bins = 2 * range + 1 
plt.hist(X, bins) 

enter image description here

+0

Tôi đánh giá cao câu trả lời từ cả hai @ayhan và bakkal. Xin vui lòng, tôi chỉ yêu cầu điều này cho kiến ​​thức của tôi; Tôi không muốn xúc phạm câu trả lời. Chỉ cần nhìn vào cốt truyện, Bakkal là đối xứng hơn. Cả hai đều có vẻ đầy đủ và từ các mã có vẻ không kém phần hợp lệ. Nhưng sự hiểu biết của tôi là yếu. Có một phương pháp khách quan tốt hơn? –

+1

@RobertLugg đối xứng tương đối cao hơn có thể do kích thước mẫu lớn hơn. Điều đó nói rằng, tôi nghĩ rằng mã trong câu trả lời này là đơn giản hơn. – bakkal

Các vấn đề liên quan