#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
#include <vector>
template <typename T, typename Rnd>
class Deck
{
public:
Deck(const std::vector<T>& cards, Rnd& rnd) : cards(cards), rnd(rnd)
{
shuffle();
}
T draw() {
++index;
if (index == cards.size())
{
shuffle();
index = 0;
}
return cards[index];
}
private:
void shuffle()
{
std::cout << "shuffle\n";
std::shuffle(this->cards.begin(), this->cards.end(), rnd);
}
private:
std::vector<T> cards;
std::size_t index = -1;
Rnd& rnd;
};
int main()
{
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937 rnd(seed);
Deck<int, std::mt19937> deck({1, 1, 2, 2, 3, 3, 4, 4, 0, 5}, rnd);
for (int i = 0; i != 42; ++i) {
std::cout << deck.draw() << std::endl;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8dmVjdG9yPgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSbmQ+CmNsYXNzIERlY2sKewpwdWJsaWM6CiAgICBEZWNrKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBjYXJkcywgUm5kJiBybmQpIDogY2FyZHMoY2FyZHMpLCBybmQocm5kKQogICAgewogICAgICAgIHNodWZmbGUoKTsKICAgIH0KICAgIAogICAgVCBkcmF3KCkgewogICAgICAgICsraW5kZXg7CiAgICAgICAgaWYgKGluZGV4ID09IGNhcmRzLnNpemUoKSkKICAgICAgICB7CiAgICAgICAgICAgIHNodWZmbGUoKTsKICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2FyZHNbaW5kZXhdOwogICAgfQpwcml2YXRlOgogICAgdm9pZCBzaHVmZmxlKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgInNodWZmbGVcbiI7CiAgICAgICAgc3RkOjpzaHVmZmxlKHRoaXMtPmNhcmRzLmJlZ2luKCksIHRoaXMtPmNhcmRzLmVuZCgpLCBybmQpOwogICAgfQogICAgCnByaXZhdGU6CiAgICBzdGQ6OnZlY3RvcjxUPiBjYXJkczsKICAgIHN0ZDo6c2l6ZV90IGluZGV4ID0gLTE7CiAgICBSbmQmIHJuZDsKfTsKCgppbnQgbWFpbigpCnsKICAgIHVuc2lnbmVkIHNlZWQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKTsKICAgIHN0ZDo6bXQxOTkzNyBybmQoc2VlZCk7CiAgICBEZWNrPGludCwgc3RkOjptdDE5OTM3PiBkZWNrKHsxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCAwLCA1fSwgcm5kKTsKCgogICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gNDI7ICsraSkgewogICAgICAgIHN0ZDo6Y291dCA8PCBkZWNrLmRyYXcoKSA8PCBzdGQ6OmVuZGw7ICAgCiAgICB9Cn0K