This article has been localized into Czech by the community.
Náhodnost s třídou Random
V určitém okamžiku pravděpodobně budete potřebovat dosáhnout náhodnosti ve vaší aplikaci. Důvodů může být mnoho - možná potřebujete seřadit položky seznamu do náhodného pořadí (zamíchání) nebo možná právě vytváříte hru a chcete, aby protivník se pohyboval náhodným směrem. Ať už je důvod jakýkoliv, potřebujete nějaký způsob, jak získat náhodnou hodnotu od počítače, a naštěstí nám C# s tím může pomoci.
Ve většině případů to začíná třídou Random, která vám umožní generovat jeden nebo více náhodných čísel v určitém rozsahu. Její použití je dokonce poměrně jednoduché:
Random random = new Random();
Console.WriteLine("A random number: " + random.Next());
Právě inicializujeme novou instanci třídy Random a poté voláme metodu Next(), k získání náhodného čísla (celého čísla) - velmi jednoduchá záležitost!
Pokud potřebujete číslo s desetinnými místy místo celého čísla, můžete místo toho použít metodu NextDouble() - dá vám číslo mezi 0,0 (zahrnuto) a 0,99 (vlastně cokoli pod 1,0):
Random random = new Random();
Console.WriteLine("A random number with decimals: " + random.NextDouble());
Random rozsah
Ve většině případů nechcete jen nějaké náhodné číslo - chcete ho v nějakém rozsahu, například mezi 1 a 100. Žádný problém, třída Random to umí velmi snadno:
Random random = new Random();
Console.WriteLine("A random number between 1 and 100: " + random.Next(1, 101));
Jednoduše změním volání metody Next() na volání, které zahrnuje minimální a maximální číslo. Všimněte si, že zatímco minimální hodnota je inkluzivní (to znamená, že toto číslo je zahrnuto v možném výsledku), maximální hodnota je exkluzivní (toto číslo NENÍ zahrnuto v možném výsledku), což je důvod, proč používám 101 místo 100. Pokud byste chtěli, aby číslo bylo mezi 0 a 99, vypadalo by to takto:
Console.WriteLine("A random number between 0 and 99: " + random.Next(0, 100));
Zasazení třídy Random
Třída Random je vždy inicializována se základním číslem (seed), buď přímo, pokud jedno zadáte, nebo nepřímo frameworkem. Toto základní číslo vám umožňuje v podstatě kontrolovat náhodnost - specifické základní číslo použité vícekrát vám umožní vytvořit stejnou sadu náhodných čísel. To může znít divně, ale může být užitečné pro testování konkrétních scénářů ve vaší aplikaci/hře.
Zasazení je dodáno třídě Random pomocí přetížení konstruktoru takto:
Random random = new Random(1000);
Podívejme se, co se stane, když to použijeme k vygenerování 5 náhodných čísel po sobě:
Random random = new Random(1000);
for(int i = 0; i < 5; i++)
Console.WriteLine("A random number between 1 and 100: " + random.Next(1, 101));
Bez ohledu na to, kolikrát tento kód spustíte, jsem si jistý, že 5 "náhodných" čísel, která získáte, bude vypadat takto:
A random number between 1 and 100: 16
A random number between 1 and 100: 24
A random number between 1 and 100: 76
A random number between 1 and 100: 1
A random number between 1 and 100: 70
Jak vidíte, náhodné hodnoty vytvořené třídou Random nejsou po všem tak náhodné. Místo toho používají hodnotu seedu (zasazení) k vytvoření pseudonáhodných hodnot. Proto, pokud neposkytnete seed vy, framework vytvoří jeden za vás. V původním .NET frameworku se používá aktuální čas, zatímco modernější .NET core framework použije thread-static, pseudonáhodný generátor čísel, pro generování seedu. Jinými slovy, pokud nepotřebujete kontrolovanou náhodnost, můžete jednoduše zůstat u výchozího konstruktoru třídy Random, jak bylo použito v prvních příkladech.
Shrnutí
Použití třídy Random k vygenerování náhodného čísla je jednoduché, ale pokud nechcete, aby byla náhodnost předvídatelná, je třeba použít náhodný seed - framework se o to postará za vás, pokud konkrétně neposkytnete seed prostřednictvím přetížení konstruktoru.
Buďte si vědomi, že vytvoření instance třídy Random je poměrně náročné, takže to nedělejte opakovaně uvnitř smyčky - místo toho jednoduše vytvořte jednu instanci Random a metodu Next() zavolejte tolikrát, kolikrát potřebujete.
Nakonec, jak jsme již diskutovali, třída Random je generátor pseudonáhodných čísel. Pokud potřebujete něco, co je bezpečnější, například pro kryptografii a/nebo generování náhodných hesel, můžete použít třídu RNGCryptoServiceProvider.