19 Haziran 2018 Salı

STL Shuffle Algoritmaları

Giriş
STL algoritmalarını işlevlerine göre gruplamak anlamayı çok daha kolaylaştırıyor. Aşağıdaki algoritmalar rastgele karıştırma (shuffling) algoritmalarını gösteriyor.

random_shuffle - kullanmayın
std::shuffle(), std::random_shuffle() metodunun yerini aldı. std::random() shuffle depricate ediliyor.

random_shuffle metodunun imzası aşağıda.
template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );
Metod içeride C kütüphanesinin rand() metodunu kullanarak sayı üretebilir. Açıklaması şöyle
...the function std::rand is often used.
Yani std::rand() kullanılmak zorunda değil.

Bu metodu kullanmak için aşağıdaki gibi yapıyorduk
std::random_shuffle(v.begin(),v.end()); //no longer valid in c++14

shuffle
İmzası şöyle.
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g);
Verilen aralığı rastgele karıştırır. std::random_shuffle()'dan farklı olarak random number generator girmemize izin verir.

Java'daki Collections.shuffle() metoduna benzer. Farklı olarak, C++ metodu sadece RandomAccessIterator ile çalışır. Java'daki metod ise gerekirse verilen listenin bir kopyasını alır ve karıştırıp geri verir.

Forwarding Reference Parametre
Son parametre forwarding reference olduğu için RNG l-value veya r-value olabilir.
Örnek
l-value için şöyle yaparız.
std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);
r-value için şöyle yaparız.
std::shuffle(v.begin(), v.end(), std::mt19937(rd()));
Örnek  - mt19937
Şöyle yaparız.
std::random_device rd;
std::mt19937 generator(rd());
std::shuffle(a.begin(), a.end(), generator);
[0-6] arasında rastgele sayı üretmek için şöyle yaparız.
int max_num = 6;
// Create vector
std::vector<int> container(max_num);
// Fill it with numbers 0, 1, ..., max_num - 1)
std::iota(container.begin(), container.end(), 0)
// Create random engine generator
std::mt19937 generator{ std::random_device{}() };
// shuffle it!!
std::shuffle(container.begin(), container.end(), generator);
Örnek
Şöyle yaparız.
static std::mt19937 engine = [] {
  
  std::random_device rd;
  std::mt19937 engine(rd());

  return engine;
}();

// You should be able to just use y.begin(), y.end()
std::shuffle(v.begin(), v.end(), engine);
Örnek  - default_random_engine
Şöyle yaparız.
std::array<card, 52> deck;

std::iota(deck.begin(), deck.end(), 0);
std::shuffle(deck.begin(), deck.end(), std::default_random_engine());


Hiç yorum yok:

Yorum Gönder