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 0
và RAND_MAX
. RAND_MAX
khô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.
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.
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.
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_SUMS
là 100 và RAND_MAX
là 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?