Úkol: std::shuffle v C++
Funkce std::shuffle je součástí standardní knihovny C++ a slouží k náhodnému promíchání prvků v kontejneru. Tato funkce je užitečná v situacích, kdy potřebujete náhodně změnit pořadí prvků, například při implementaci herních algoritmů, simulací nebo testování.
Základní informace o std::shuffle
Funkce std::shuffle byla zavedena ve standardu C++11 a nahradila starší funkci std::random_shuffle, která byla ve standardu C++17 označena za zastaralou (deprecated) a v C++20 odstraněna. Hlavní rozdíl mezi těmito dvěma funkcemi spočívá v tom, že std::shuffle vyžaduje explicitní generátor náhodných čísel, což zajišťuje větší flexibilitu a kontrolu nad generováním náhodnosti.
Deklarace funkce
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g);
Parametry
firstalast: Iterátory určující rozsah prvků, které mají být promíchány. Rozsah je [first, last).g: Generátor náhodných čísel, který musí splňovat požadavky Uniform Random Bit Generator (URBG).
Návratová hodnota
Funkce nemá návratovou hodnotu, ale přímo mění pořadí prvků v zadaném rozsahu.
Jak používat std::shuffle
Použití funkce std::shuffle je jednoduché. Nejprve musíte mít kontejner (například std::vector) a generátor náhodných čísel, například std::mt19937 z knihovny <random>.
Příklad použití
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
int main() {
// Vytvoření vektoru s čísly
std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// Inicializace generátoru náhodných čísel
std::random_device rd; // Zdroj entropie
std::mt19937 gen(rd()); // Mersenne Twister generátor
// Promíchání prvků
std::shuffle(data.begin(), data.end(), gen);
// Výpis výsledku
std::cout << "Promíchaný vektor: ";
for (int n : data) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
Vysvětlení kódu
- Vektor: Vytvoříme vektor
dataobsahující čísla od 1 do 10. - Generátor: Použijeme
std::random_devicepro inicializaci generátorustd::mt19937. - Promíchání: Funkce
std::shufflezmění pořadí prvků ve vektoru na základě generátoru. - Výstup: Výsledný vektor je vypsán na standardní výstup.
Výhody std::shuffle
- Flexibilita: Umožňuje použití různých generátorů náhodných čísel.
- Deterministické výsledky: Pokud použijete generátor se stejným seedem, získáte opakovatelné výsledky.
- Bezpečnost: Na rozdíl od
std::random_shufflenení závislá na globálním generátoru náhodných čísel.
Závěr
Funkce std::shuffle je výkonný nástroj pro náhodné promíchání prvků v C++. Díky požadavku na explicitní generátor náhodných čísel poskytuje větší kontrolu a předvídatelnost. Pokud pracujete s náhodností ve svých aplikacích, je std::shuffle moderním a doporučeným řešením.