TOC

This article has been localized into Czech by the community.

Různé:

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.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!