26 Ağustos 2019 Pazartesi

std::uniform_real_distribution Sınıfı

Giriş
Dağılım [a-b) arasında yarı açık bir dağılımdır. Açıklaması şöyle
Produces random floating-point values i, uniformly distributed on the interval [a, b)
uniform_int_distribution, normal_distribution sınıfları ile kardeştir.

Diğer daha az kullanılan dağılım sınıfları şöyle.
std::weibull_distribution<double>
std::exponential_distribution<double>
std::lognormal_distribution<double>;
std::chi_squared_distribution<double>
Diğer Kısıtlar
Açıklaması şöyle
explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
Requires: a  b and b  a  numeric_limits<RealType>::max().
Effects: Constructs a uniform_real_distribution object; a and b correspond to
the respective parameters of the distribution.
Döndürdüğü Tip
Bu dağılımın default template tipi double olduğu için tip vermek zorunda değiliz.
template <class RealType = double>
class uniform_real_distribution;
Yani şöyle kullanabiliyoruz.
std::uniform_real_distribution<> randomizer(0, 100);
1. Yarı Açık Kullanım
Örnek
Şöyle yaparız. [0 - 1) arasında değer döndürür.
#include <random>
#include <iostream>

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0, 1);
double uniformOn01 = dis(gen);
2. Kapalı Kullanım
Eğer kapalı bir dağılım istersek std::nextafter ile bir sonraki sayısı almamız gerekir.
Örnek
Şöyle yaparız. [0,1] arasında değer döndürür. std::nextafter()'a verilen parametre 1'den 2 yönüne doğru giderken 1'den sonraki gelen ilk sayıyı ver anlamına gelir.
std::uniform_real_distribution<float> dist(0.f, std::nextafter(1.f, 2.f))
Örnek
Şöyle yaparız. [0,M_PI] arasında değer döndürür. 2 * M_PI ile de hangi yöndeki bir sonraki sayıyı istediğimizi belirtiriz.
#include <iostream>
#include <random>

std::random_device rd;
std::default_random_engine gen(rd());
std::uniform_real_distribution<double> dis{0.0, std::nextafter(M_PI, 2.*M_PI)};
std::cout << dis (gen) << std::endl;
Max Kullanım
Şöyle yaparız.
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double> dis(
                                std::numeric_limits<double>::min(), 
                                std::numeric_limits<double>::max());

double test = dis (gen);

Hiç yorum yok:

Yorum Gönder