Tôi cần mã nguồn c hoặc C++ của một hàm như betarand(a,b)
tạo số ngẫu nhiên với phân phối beta. Tôi biết rằng tôi có thể sử dụng thư viện tăng nhưng tôi sẽ chuyển nó cho kiến trúc CUDA vì vậy tôi cần mã. Ai đó có thể giúp tôi được không?
Trong thời gian chờ đợi, tôi có betapdf
(Chức năng mật độ xác suất beta). Nhưng tôi không biết cách sử dụng nó để tạo số ngẫu nhiên :).Trình tạo số ngẫu nhiên có phân phối beta
Trả lời
C++ 11 thư viện số ngẫu nhiên không cung cấp một phân phối phiên bản beta. Tuy nhiên, bản phân phối beta có thể được mô hình hóa theo hai bản phân phối gamma, mà thư viện cung cấp. Tôi đã triển khai beta_distribution
theo điều khoản của std::gamma_distribution
cho bạn. Theo như tôi có thể nói, nó hoàn toàn phù hợp với các yêu cầu đối với Phân phối số ngẫu nhiên.
#include <iostream>
#include <sstream>
#include <string>
#include <random>
namespace sftrabbit {
template <typename RealType = double>
class beta_distribution
{
public:
typedef RealType result_type;
class param_type
{
public:
typedef beta_distribution distribution_type;
explicit param_type(RealType a = 2.0, RealType b = 2.0)
: a_param(a), b_param(b) { }
RealType a() const { return a_param; }
RealType b() const { return b_param; }
bool operator==(const param_type& other) const
{
return (a_param == other.a_param &&
b_param == other.b_param);
}
bool operator!=(const param_type& other) const
{
return !(*this == other);
}
private:
RealType a_param, b_param;
};
explicit beta_distribution(RealType a = 2.0, RealType b = 2.0)
: a_gamma(a), b_gamma(b) { }
explicit beta_distribution(const param_type& param)
: a_gamma(param.a()), b_gamma(param.b()) { }
void reset() { }
param_type param() const
{
return param_type(a(), b());
}
void param(const param_type& param)
{
a_gamma = gamma_dist_type(param.a());
b_gamma = gamma_dist_type(param.b());
}
template <typename URNG>
result_type operator()(URNG& engine)
{
return generate(engine, a_gamma, b_gamma);
}
template <typename URNG>
result_type operator()(URNG& engine, const param_type& param)
{
gamma_dist_type a_param_gamma(param.a()),
b_param_gamma(param.b());
return generate(engine, a_param_gamma, b_param_gamma);
}
result_type min() const { return 0.0; }
result_type max() const { return 1.0; }
result_type a() const { return a_gamma.alpha(); }
result_type b() const { return b_gamma.alpha(); }
bool operator==(const beta_distribution<result_type>& other) const
{
return (param() == other.param() &&
a_gamma == other.a_gamma &&
b_gamma == other.b_gamma);
}
bool operator!=(const beta_distribution<result_type>& other) const
{
return !(*this == other);
}
private:
typedef std::gamma_distribution<result_type> gamma_dist_type;
gamma_dist_type a_gamma, b_gamma;
template <typename URNG>
result_type generate(URNG& engine,
gamma_dist_type& x_gamma,
gamma_dist_type& y_gamma)
{
result_type x = x_gamma(engine);
return x/(x + y_gamma(engine));
}
};
template <typename CharT, typename RealType>
std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& os,
const beta_distribution<RealType>& beta)
{
os << "~Beta(" << beta.a() << "," << beta.b() << ")";
return os;
}
template <typename CharT, typename RealType>
std::basic_istream<CharT>& operator>>(std::basic_istream<CharT>& is,
beta_distribution<RealType>& beta)
{
std::string str;
RealType a, b;
if (std::getline(is, str, '(') && str == "~Beta" &&
is >> a && is.get() == ',' && is >> b && is.get() == ')') {
beta = beta_distribution<RealType>(a, b);
} else {
is.setstate(std::ios::failbit);
}
return is;
}
}
Sử dụng nó như vậy:
std::random_device rd;
std::mt19937 gen(rd());
sftrabbit::beta_distribution<> beta(2, 2);
for (int i = 0; i < 10000; i++) {
std::cout << beta(gen) << std::endl;
}
Xin chào! Hy vọng bạn vẫn đọc điều này sau một vài năm, nhưng nếu tôi không nhầm lẫn khi đọc đơn thuốc thế hệ này: https://en.wikipedia.org/wiki/Beta_distribution#Generating_beta-distributed_random_variates chức năng tạo nên trả về x_gamma (động cơ)/ (x_gamma (engine) + y_gamma (engine) và không sử dụng cùng một giá trị x hai lần – Daniel
@Daniel Tôi đã không hoạt động trên Stack Overflow trong vài năm và cuối cùng tôi cũng xem xét bất kỳ nhận xét nào về bài đăng của mình .Bây giờ tôi hơi lo lắng trong trường hợp ai đó sử dụng việc triển khai này và có thể là không chính xác - tuy nhiên, tôi đã thử triển khai nó thay vì bạn đã mô tả và dường như không tạo ra phân phối thích hợp. Tuy nhiên, như trong câu trả lời này, phân phối dường như đúng. Thật không may, tôi không thể tìm thấy một nguồn tốt cho thấy phân phối gamma X được lấy mẫu một lần hay hai lần. Nếu bạn có thêm thông tin, vui lòng cho tôi biết! –
Kiểm tra việc triển khai bộ tạo số ngẫu nhiên trong NumPy
: NumPy distributions source
Chúng được thực hiện trong C, và làm việc rất nhanh.
Có thể bạn có thể sử dụng mã mà gsl
sử dụng để tạo số ngẫu nhiên với bản phân phối beta. Họ sử dụng một cách kỳ lạ của produging chúng, như bạn phải vượt qua một máy phát điện số ngẫu nhiên để chức năng, nhưng chắc chắn bạn có thể có được những gì bạn cần.
Đây là documentation và web page
Boost "nghịch đảo không đầy đủ Beta" là một cách nhanh chóng (và đơn giản) để mô phỏng Betas.
#include <random>
#include <boost/math/special_functions/beta.hpp>
template<typename URNG>
double beta_sample(URNG& engine, double a, double b)
{
static std::uniform_real_distribution<double> unif(0,1);
double p = unif(engine);
return boost::math::ibeta_inv(a, b, p);
// Use Boost policies if it's not fast enough
}
- 1. Trình tạo số ngẫu nhiên phân phối ngẫu nhiên
- 2. Số ngẫu nhiên từ bản phân phối Beta, C++
- 3. Trình tạo số giả ngẫu nhiên - Phân phối số mũ
- 4. Tạo Số ngẫu nhiên Dựa trên Phân phối Beta bằng cách sử dụng Boost
- 5. Phân phối số ngẫu nhiên thế hệ
- 6. Tạo các số ngẫu nhiên theo các bản phân phối
- 7. Hiểu phân bố Poisson của trình tạo số ngẫu nhiên
- 8. Trình tạo số ngẫu nhiên tạo số nguyên cho Java
- 9. Bias trong ngẫu nhiên số phân phối bình thường (javascript)
- 10. phát sinh số ngẫu nhiên được phân phối đồng đều
- 11. phân phối ngẫu nhiên Gaussian trong PostgreSQL
- 12. PHP: số ngẫu nhiên từ một phân phối chuẩn
- 13. Trình tạo số ngẫu nhiên không đồng nhất?
- 14. Cách nhận số ngẫu nhiên với trình tạo sai
- 15. c - trình tạo số ngẫu nhiên
- 16. Phân tích số ngẫu nhiên
- 17. Điều gì sẽ xảy ra khi bạn sao chép công cụ số ngẫu nhiên và phân phối số ngẫu nhiên?
- 18. Tạo số ngẫu nhiên lognormal trong MATLAB?
- 19. Tạo số ngẫu nhiên lớn
- 20. Tạo số ngẫu nhiên giữa 0 và 1 với phân phối gaussian
- 21. Tạo số ngẫu nhiên 2^30
- 22. Tạo số ngẫu nhiên không đồng nhất
- 23. Phân phối ngẫu nhiên (Monte-Carlo) trên quả cầu đơn
- 24. Mẫu ngẫu nhiên từ phân phối riêng biệt bivariate
- 25. Tạo số ngẫu nhiên CUDA
- 26. Tạo một số thập phân ngẫu nhiên trong C#
- 27. Trình tạo số ngẫu nhiên trong Haskell thread-safe?
- 28. Số thập lục phân được tạo ngẫu nhiên trong C#
- 29. Làm cách nào để tạo số ngẫu nhiên bằng Python?
- 30. số ngẫu nhiên không quá ngẫu nhiên
hmm, tôi đoán theo định nghĩa nếu các số được tạo theo cách nào đó chúng có thể được mô tả như một phần của phân phối, chúng không được ngẫu nhiên. :) nhưng anyway .. hiện [chức năng beta này] (http://projects.scipy.org/numpy/browser/trunk/numpy/random/mtrand/distributions.c) làm việc cho bạn? – Mike
@Mike, định nghĩa nào? Bạn có ngụ ý rằng phân phối tuyến tính "ngẫu nhiên hơn" so với bất kỳ phân phối nào khác không? – Kos
Theo http://en.wikipedia.org/wiki/Beta_distribution#Generating_beta-distributed_random_variates bạn có thể tạo phân phối Beta từ 2 Phân phối Gamma. Vì C++ 11 cung cấp phân phối gamma, nên có thể sử dụng chúng để tạo phân phối beta. –