2013-03-07 12 views
5

Tôi gặp sự cố khi tạo số ngẫu nhiên được phân phối bình thường (mu = 0 sigma = 1) bằng JavaScript.Bias trong ngẫu nhiên số phân phối bình thường (javascript)

Tôi đã thử phương pháp Box-Muller và ziggurat, nhưng giá trị trung bình của chuỗi số được tạo ra là 0.0015 hoặc -0.0018 - rất xa so với số không !! Hơn 500.000 con số được tạo ngẫu nhiên, đây là một vấn đề lớn. Nó phải gần bằng không, giống như 0.000000000001.

Tôi không thể tìm hiểu xem đó có phải là vấn đề về phương pháp hay không hoặc được xây dựng trong JavaScript Math.random() không tạo ra số lượng phân phối đồng đều chính xác hay không.

Có ai đó đã tìm thấy sự cố tương tự không?

Ở đây bạn có thể tìm thấy chức năng ziggurat:

http://www.filosophy.org/post/35/normaldistributed_random_values_in_javascript_using_the_ziggurat_algorithm/

Và dưới đây là mã cho Box-Muller:

function rnd_bmt() { 
    var x = 0, y = 0, rds, c; 

    // Get two random numbers from -1 to 1. 
    // If the radius is zero or greater than 1, throw them out and pick two 
    // new ones. Rejection sampling throws away about 20% of the pairs. 
    do { 
     x = Math.random()*2-1; 
     y = Math.random()*2-1; 
     rds = x*x + y*y; 
    } 
    while (rds === 0 || rds > 1) 

    // This magic is the Box-Muller Transform 
    c = Math.sqrt(-2*Math.log(rds)/rds); 

    // It always creates a pair of numbers. I'll return them in an array. 
    // This function is quite efficient so don't be afraid to throw one away 
    // if you don't need both. 
    return [x*c, y*c]; 
} 
+2

Sẽ dễ dàng hơn nếu bạn đăng mã của mình. –

Trả lời

5

Nếu bạn tạo n biến ngẫu nhiên bình thường độc lập, standard deviation of the mean sẽ là sigma/sqrt(n).

Trong trường hợp của bạn n = 500000sigma = 1 do đó lỗi chuẩn của giá trị trung bình là khoảng 1/707 = 0.0014. Khoảng tin cậy 95%, được cho là 0 trung bình, sẽ là khoảng hai lần số này hoặc (-0.0028, 0.0028). Mẫu của bạn có nghĩa là tốt trong phạm vi này.

Kỳ vọng của bạn khi nhận được 0.000000000001 (1e-12) không được căn cứ về mặt toán học. Để đạt được phạm vi chính xác đó, bạn cần tạo khoảng 10^24 mẫu. Với 10.000 mẫu mỗi giây vẫn sẽ mất 3 năm để làm ... năm nay chính xác là lý do tại sao nó tốt để tránh tính toán mọi thứ bằng cách mô phỏng nếu có thể.

Mặt khác, thuật toán của bạn dường như được triển khai chính xác :)

+0

cảm ơn rất nhiều! did't nhớ về lỗi tiêu chuẩn. – user1658162

+0

một câu hỏi cuối cùng: nếu tôi phải tạo một chuỗi 500.000 số được phân phối theo lô-gic cho giá trị trung bình và phương sai của mẫu, tôi có phải điều chỉnh một số tham số để có cùng giá trị trung bình của mẫu gốc không? – user1658162

+0

Tìm hiểu cách tính trung bình và phương sai của các tham số đã cho lognormal: http://en.wikipedia.org/wiki/Lognormal_distribution –