2013-04-12 18 views
7

Tôi muốn viết một phương thức trong C# để tạo một số ngẫu nhiên với phân phối gaussian trong phạm vi [0:1] (và trước trong [0-x]). tôi tìm thấy mã này, nhưng không hoạt động chính xácTạo số ngẫu nhiên giữa 0 và 1 với phân phối gaussian

Random rand = new Random(); //reuse this if you are generating many 
double u1 = rand.NextDouble(); //these are uniform(0,1) random doubles 
double u2 = rand.NextDouble(); 
double randStdNormal = Math.Abs(Math.Sqrt(-2.0 * Math.Log(u1)) * 
           Math.Sin(2.0 * Math.PI * u2)); 
+7

Có thể trùng lặp? http://stackoverflow.com/q/1303368/2065121 –

+0

@ RogerRowland, không có gì khác biệt với điều đó, tôi muốn viết một phương pháp đơn giản không phải là một lớp, tôi tìm thấy điều này mehod nhưng phương pháp này trả lại cho tôi kết quả tiêu cực đôi khi và không chính xác kết quả – zhilevan

+4

Sự khác biệt giữa một "phương pháp đơn giản" và một lớp học chỉ là bao bì. Câu trả lời đó có thông tin bạn cần, đặc biệt là phương pháp. Gói nó tuy nhiên bạn muốn. –

Trả lời

2

tôi đã viết một bài đăng blog về cách tạo số ngẫu nhiên với bất kỳ phân phối đưa ra:

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

Tổng hợp, thuật toán bạn muốn là:

  1. Làm việc với chức năng phân phối xác suất mong muốn sao cho khu vực đó dưới một phần của đường cong bằng với xác suất của một giá trị được tạo ngẫu nhiên trong phạm vi đó.
  2. Tích hợp phân phối xác suất để xác định phân phối tích lũy .
  3. Đảo ngược phân phối tích lũy để có chức năng định lượng định lượng.
  4. Chuyển đổi dữ liệu ngẫu nhiên được phân phối đồng đều trên (0,1) của bạn bằng cách chạy nó thông qua chức năng định lượng.

Tất nhiên nếu bạn đã biết chức năng định lượng cho bản phân phối mong muốn của mình thì bạn không cần thực hiện các bước từ một đến ba.

1

Bạn nói rằng bạn muốn có một máy phát điện cho phân phối chuẩn (gaussian) số ngẫu nhiên giữa 0 và 1.

Đầu tiên của tất cả các phân phối bình thường không bị giới hạn ... các chức năng bạn hiển thị trong ví dụ của bạn tạo ra thường được phân phối ngẫu nhiên các số có giá trị trung bình 0.0 và độ lệch chuẩn là 1.0

Bạn có thể tạo giá trị ngẫu nhiên được phân phối bình thường của bất kỳ giá trị trung bình và độ lệch chuẩn nào bằng cách nhân giá trị bạn nhận được từ hàm này với độ lệch chuẩn mong muốn và sau đó thêm giá trị trung bình mong muốn. .

Mã OK là - vấn đề là sự hiểu lầm về phân phối gaussian (bình thường) có phạm vi -inf đến + inf ...

khoảng 2/3 thời gian bạn nhận được sẽ nằm trong khoảng +/- 1 độ lệch chuẩn. ... khoảng 95% thời gian giá trị sẽ nằm trong khoảng +/1 3 lần độ lệch chuẩn ...