15 Şubat 2017 Çarşamba

std::uniform_int_distribution Sınıfı

Giriş
Uniform Distribution tek düze dağılım demek.

Bu sınıf uniform_real_distribution, sınıfı ile kardeştir.

Constructor'a 
bir üreteç nesnesi verilir

Hangi Tiplerler Kullanılabilir
Bu sınıf sadece belli tiplerle kullanılabilir. Mesela uint8_t ile kullanılamaz.
The effect is undefined if this is not one of short, int, long, long long, unsigned short, unsigned int, unsigned long, or unsigned long long.
Yani şu kod yanlış
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<uint8_t> dd(0, 255); //Don't do this!
...
ch = uint8_t(dd(gen));
bool olarak kullanmak
Şöyle yaparız.
std::random_device   rd;
std::uniform_int_distribution<> randomizer(0, 1);
const int val randomizer(std::mt19937(rd()));
const bool result = static_cast<bool>(val);
Sınıf Ne İşe Yarar
Sınıf tek düze dağılım yapar. Dağılım [a-b] arasında kapalı bir dağılımdırÖrnek:
#include <random>
...
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1,6);
int dice_roll = distribution(generator);  //range 1..6
Eğer istersek aralık vermeyiz. Bu durumda generator 0, ve uint max arasında bir dağılım elde ederiz.
#include <random>
#include <chrono>

auto seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine generator(seed);
std::uniform_int_distribution<uint> distribution;
uint randomUint = distribution(generator);
Sınıfın Maliyeti
Bu sınıfı yaratmak pahalı değildir. Bu yüzden stack'te defalarca yaratılabilir. Örnekte DrawNumber metodu her çağrıldığında bir uniform_int_distribution nesnesi yaratıyor ancak işlemci kullanımına etkisi çok az.
using uint32 = unsigned int;

class Random {
public:
    Random() = default;
    Random(std::mt19937::result_type seed) : eng(seed) {}
    uint32 DrawNumber(uint32 min, uint32 max);

private:        
    std::mt19937 eng{std::random_device{}()};
};

uint32 Random::DrawNumber(uint32 min, uint32 max)
{
    return std::uniform_int_distribution<uint32>{min, max}(eng);
}

Hiç yorum yok:

Yorum Gönder