Thực hiện biến ngẫu nhiên Gaussian bằng cách sử dụng biến ngẫu nhiên thống nhất


11

Tôi đang cố gắng viết một hàm C ++ sẽ trả về các giá trị ngẫu nhiên Gaussian, với các phương tiện và phương sai của chúng.

Có một hàm thư viện rand(), trả về các số ngẫu nhiên giữa 0RAND_MAX. RAND_MAXkhông có giá trị cố định, nhưng được bảo đảm rằng nó sẽ có ít nhất . PDF của nó là thống nhất.2151

Tôi đang sử dụng Định lý giới hạn trung tâm để biến đổi nó rand()thành biến Gaussian. Điều tôi chính xác đang làm là gọi rand()cho người dùng chỉ định thời gian, sau đó cộng các giá trị trả về của họ, sau đó chuyển giá trị trung bình của nó sang giá trị trung bình do người dùng chỉ định.

Gaussian PDF
Trong sơ đồ trên, tôi đã gọi trình tạo ngẫu nhiên Gaussian của mình trong lần và vẽ các tần số của các giá trị trả về của nó. Như bạn thấy, phương sai của nó là rất lớn, vì nó được tạo ra bởi tổng của rất nhiều giá trị ngẫu nhiên khác.107

Nó trả về thành công một biến Gaussian với Gaussian PDF và với giá trị trung bình được chỉ định. Tuy nhiên, vấn đề là phương sai của nó. Tôi bị mắc kẹt tại thời điểm này, vì tôi không biết cách thay đổi phương sai của nó thành giá trị do người dùng chỉ định.

Đây là mã của tôi (hiện tại chưa hoàn chỉnh; tham số "Phương sai" bị bỏ qua):

template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
    T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
    T Rand = 0;
    for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
    {
        Rand += static_cast<T>(rand()) / RAND_MAX;
    }
    return Rand - (MeanOfSum - Mean);
}

Giả sử NUM_GAUSSIAN_SUMSlà 100 và RAND_MAXlà 32767.

Tôi muốn thay đổi phương sai của biến ngẫu nhiên theo tham số của hàm. Câu hỏi của tôi là, làm thế nào tôi có thể thay đổi phương sai của biến ngẫu nhiên này? Tôi làm nó như thế nào?


3
Có nhiều cách tốt hơn và nhanh hơn định lý giới hạn trung tâm để tạo các biến ngẫu nhiên Gaussian. Tìm kiếm phương thức Box-Muller cho một; một phương pháp ziggurat được cho là thậm chí còn tốt hơn.
Dilip Sarwate


3
12 U(0,1)1006N(0,1)Y=σX+μN(μ,σ2)(μ6σ,μ+6σ)

@DilipSarwate có lẽ bạn nên đăng những lựa chọn thay thế đó như một câu trả lời với lời biện minh cho lý do tại sao chúng tôi muốn nó
Ivo Flipse

@IvoFlipse Câu trả lời cho câu hỏi "Làm cách nào để sửa phương sai sau khi tôi đã sửa giá trị trung bình?" về cơ bản là những gì câu trả lời được chấp nhận bởi Hilmar nói, như được sửa đổi bởi các ý kiến: sửa phương sai bằng cách chia tỷ lệ và sau đó sửa lại giá trị trung bình, hoặc tốt hơn là không bắt đầu bằng cách sửa giá trị trung bình trước vì bạn sẽ phải sửa lại trễ rồi; sửa phương sai trước bằng cách chia tỷ lệ và sau đó sửa giá trị trung bình. OP không chỉ ra rằng anh ấy / cô ấy hoàn toàn quan tâm đến các phương pháp tốt hơn và thậm chí còn không nâng cấp liên kết của nibot, thậm chí còn có mã cho phương thức Box-Muller. Vì vậy, tôi sẽ để mọi thứ như họ đang có.
Dilip Sarwate

Câu trả lời:


6

Thuật toán ban đầu của bạn tạo ra một biến ngẫu nhiên được phân phối đồng đều giữa 0 và 1. Phương sai của đó là 1/12. Nếu bạn tính tổng NUM_GAUSSIAN_SUMSthể của phương sai đó sẽ là NUM_GAUSSIAN_SUMS/12. Để có được phương sai mục tiêu V, bạn cần nhân biến ngẫu nhiên tổng hợp với sqrt(V*12/NUM_GAUSSIAN_SUMS).

Là một lưu ý phụ, một mẫu sẽ hoạt động tốt hợp lý cho phao và đôi nhưng sẽ có vấn đề về số lượng đáng kể với bất kỳ loại điểm cố định nào.


5

Làm thế nào tôi có thể thay đổi phương sai của biến ngẫu nhiên này?

cXcXc2X


cXcX

1
Trung tâm, bán lại, sau đó khôi phục lại giá trị trung bình. Chia tỷ lệ một biến ngẫu nhiên trung tâm sẽ không ảnh hưởng đến trung bình (không).
Emre

1

Vẫn còn một cách khác!

Hãy nghĩ về nó, nếu bạn muốn một số phân phối khác trái ngược với Gaussian thì sao? Trong trường hợp đó, bạn không thể thực sự sử dụng định lý Giới hạn trung tâm; Làm thế nào để bạn giải quyết nó?

Có một cách để chuyển đổi biến ngẫu nhiên thống nhất thành PDF tùy ý. Phương pháp này được gọi là Phương pháp biến đổi nghịch đảo

U[01]

X=FX1(U)

FX(x)

Do đó, tất cả những gì bạn cần làm là, áp dụng hàm CDF nghịch đảo cho biến bạn đã lấy từ mẫu rv thống nhất.

Ngoài ra, không giống như các phương thức trước đó - điều này sẽ không yêu cầu bất kỳ phép lặp nào và sẽ không phụ thuộc vào số lần lặp sẽ được thực hiện để đóng kết quả cho Gaussian.

Dưới đây là một trong những tài liệu tham khảo đưa ra bằng chứng về điều này.


3
> Vẫn còn một cách khác! Đúng, nhưng không liên quan đến câu hỏi đang xem xét cụ thể về các biến ngẫu nhiên Gaussian. Cả CDF Gaussian và nghịch đảo của nó đều không thể được biểu thị bằng thuật ngữ cơ bản bằng cách sử dụng số lượng hoạt động hữu hạn, và vì vậy phương pháp được đề xuất không thể được sử dụng.
Dilip Sarwate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.