2016-12-12 21 views
58

Tôi đang chơi với thư viện ngẫu nhiên trong Python để mô phỏng một dự án tôi làm việc và tôi thấy mình ở một vị trí rất lạ.Randint không phải lúc nào cũng theo phân phối đồng đều

Hãy nói rằng chúng ta có đoạn mã sau bằng Python:

from random import randint 
import seaborn as sns 

a = [] 
for i in range(1000000): 
    a.append(randint(1,150)) 

sns.distplot(a) 

Cốt truyện tuân theo phân phối “rời rạc thống nhất” như nó phải.

Range betwee 1 and 150

Tuy nhiên, khi tôi thay đổi phạm vi 1-110, cốt truyện có một số đỉnh núi.

from random import randint 
import seaborn as sns 

a = [] 
for i in range(1000000): 
    a.append(randint(1,110)) 

sns.distplot(a) 

Range from 1 to 110

ấn tượng của tôi là các đỉnh núi đang trên 0,10,20,30, ... nhưng tôi không thể giải thích nó.

Chỉnh sửa: Câu hỏi không giống với câu hỏi được đề xuất là trùng lặp vì sự cố trong trường hợp của tôi là thư viện seaborn và cách tôi trực quan hóa dữ liệu.

Chỉnh sửa 2: Theo các đề xuất về câu trả lời, tôi đã cố gắng xác minh bằng cách thay đổi thư viện seaborn. Thay vào đó, sử dụng matplotlib cả đồ thị là như nhau

from random import randint 
import matplotlib.pyplot as plt 

a = [] 
for i in range(1000000): 
    a.append(randint(1,110)) 

plt.hist(a) 

From matplotlib

+0

Bản sao có thể có của [Là Pythons random.randint random random?] (Http: // stackoverflow.com/questions/12164280/is-pythons-random-randint-thống kê-ngẫu nhiên) – ChatterOne

+5

Bạn sẽ có thể nhìn thấy từ cốt truyện mật độ hạt nhân chồng của bạn mà các đỉnh không có thật. –

+1

Và bây giờ bạn có thể giải quyết câu đố này: https://ericlippert.com/2012/02/24/a-simple-puzzle/ –

Trả lời

116

Vấn đề có vẻ là trong Grapher của bạn, seaborn, không phải trong randint().

Có 50 thùng trong sơ đồ phân phối seaborn của bạn, theo số lượng của tôi. Có vẻ như seaborn thực sự busted của bạn trả về randint() giá trị trong những thùng, và không có cách nào để có được một thậm chí lây lan của 110 giá trị vào 50 thùng. Vì vậy, bạn có được những đỉnh đó, nơi ba giá trị được đưa vào một thùng thay vì hai giá trị thông thường cho các thùng khác. Các giá trị của các đỉnh của bạn xác nhận điều này: chúng cao hơn 50% so với các thanh khác, như dự kiến ​​cho 3 giá trị binned thay vì cho 2.

Một cách khác để kiểm tra điều này là bắt buộc seaborn để sử dụng 55 thùng cho các 110 giá trị (hoặc có lẽ 10 thùng hoặc một số ước số khác là 110). Nếu bạn vẫn nhận được các đỉnh, thì bạn nên lo lắng về randint().

+12

Khi có điều gì đó hiển nhiên nhưng bạn chỉ mù! Làm cho ý nghĩa 100% bây giờ. Cảm ơn bạn vì câu trả lời. Sẽ chấp nhận nó ngay sau khi giới hạn thời gian trôi qua :) – Tasos

+4

Chúng ta đều có những khoảnh khắc nhìn rõ ràng: tôi chắc chắn sẽ làm! Và bạn được chào đón. –

20

Để thêm vào câu trả lời tuyệt vời @RoryDaulton 's, tôi chạy randint(1:110), tạo ra một số tần số và chuyển đổi nó vào một R-vector của tội như thế này:

hits = {i:0 for i in range(1,111)} 
for i in range(1000000): hits[randint(1,110)] += 1 
hits = [hits[i] for i in range(1,111)] 
s = 'c('+','.join(str(x) for x in hits)+')' 
print(s) 

c(9123,9067,9124,8898,9193,9077,9155,9042,9112,9015,8949,9139,9064,9152,8848,9167,9077,9122,9025,9159,9109,9015,9265,9026,9115,9169,9110,9364,9042,9238,9079,9032,9134,9186,9085,9196,9217,9195,9027,9003,9190,9159,9006,9069,9222,9205,8952,9106,9041,9019,8999,9085,9054,9119,9114,9085,9123,8951,9023,9292,8900,9064,9046,9054,9034,9088,9002,8780,9098,9157,9130,9084,9097,8990,9194,9019,9046,9087,9100,9017,9203,9182,9165,9113,9041,9138,9162,9024,9133,9159,9197,9168,9105,9146,8991,9045,9155,8986,9091,9000,9077,9117,9134,9143,9067,9168,9047,9166,9017,8944) 

sau đó tôi dán này để một R -console, xây dựng lại các quan sát và sử dụng R của hist() vào kết quả, lấy biểu đồ này (với đường cong mật độ chồng lên):

enter image description here

Như bạn có thể thấy, điều này khẳng định rằng vấn đề bạn quan sát không thể theo dõi được randint nhưng là một tạo phẩm của sns.displot().

+1

Tôi đếm 22 vạch trong biểu đồ đó, và dĩ nhiên 22 là ước số của 110. Cảm ơn bạn đã xác nhận và xây dựng một phần câu trả lời của tôi. –

+0

@RoryDaulton Quan sát tốt về 22. Tôi đã điều chỉnh biểu đồ sao cho bây giờ nó là biểu đồ xác suất với mật độ chồng lên nhau, do đó phù hợp chặt chẽ hơn với những gì OP đang làm. –

+0

Bạn có thể nhận được hiệu ứng tương tự với âm mưu seaborn với 'hist (x, breaks = seq (0,110, by = 2.2))'. Thật kỳ lạ, yêu cầu 50 thùng trực tiếp không cho hiệu quả. – James

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