Random
Datorer är deterministiska — de gör exakt det du säger åt dem. Slump finns inte på riktigt. Vad Random faktiskt gör är att beräkna en lång sekvens av tal som ser ut som slump, baserat på ett startvärde (seed).
I de flesta program är det precis vad du behöver.
När du läst detta ska du kunna
- Använda
Random.Sharedför enkel slump - Generera heltal, decimaltal och booleska värden
- Förklara vad ett seed är och varför det spelar roll
- Blanda en lista med
Random
Random.Shared — det moderna sättet
Sedan .NET 6 finns Random.Shared — en trådsäker delad instans som du kan använda direkt utan att skapa ett eget objekt.
int diceRoll = Random.Shared.Next(1, 7); // 1–6Console.WriteLine(diceRoll);Använd Random.Shared som förstaval i nya program.
Skapa en egen instans
var rng = new Random();
int wholeNumber = rng.Next(1, 101); // 1–100 (övre gränsen exkluderas)double randomDecimal = rng.NextDouble(); // 0.0 – 0.9999...bool truthy = rng.NextBool(); // true eller false (50/50)Vanliga metoder
var rng = new Random();
// Heltal — övre gränsen exkluderasConsole.WriteLine(rng.Next(1, 7)); // Tärning: 1–6Console.WriteLine(rng.Next(0, 52)); // Kortlek: 0–51Console.WriteLine(rng.Next(100, 200)); // 100–199
// DecimaltalConsole.WriteLine(rng.NextDouble()); // 0.0 – <1.0
// Boolean (kräver .NET 6+)Console.WriteLine(rng.NextBool()); // True eller False
// Bytesbyte[] buffer = new byte[8];rng.NextBytes(buffer); // Fyller bufferten med slumpmässiga bytesSeed — reproducerbar slump
Med ett fast seed ger Random alltid samma sekvens. Användbart för tester och demo.
var rng1 = new Random(42);var rng2 = new Random(42);
// Båda ger exakt samma sekvensConsole.WriteLine(rng1.Next(1, 7)); // T.ex. 3Console.WriteLine(rng2.Next(1, 7)); // Också 3Utan seed används systemklockan som startvärde, vilket ger en annan sekvens varje körning.
Blanda en lista
var deck = new List<string> { "Hjärter A", "Spader K", "Ruter Q", "Klöver J" };
// Fisher-Yates shufflefor (int i = deck.Count - 1; i > 0; i--){ int j = Random.Shared.Next(i + 1); (deck[i], deck[j]) = (deck[j], deck[i]);}
foreach (var card in deck) Console.WriteLine(card);Plocka ett slumpmässigt element
string[] answers = { "Ja", "Nej", "Kanske", "Fråga igen" };
int index = Random.Shared.Next(answers.Length);Console.WriteLine(answers[index]); // Ett av de fyra svarenFallgropar
Skapa inte ett nytt Random()-objekt i en loop. Samma seed (via klockan) ger samma sekvens — du får inte slump.
// Fel — alla instanser kan få samma seedfor (int i = 0; i < 5; i++){ var rng = new Random(); // Kan ge samma seed varje varv Console.WriteLine(rng.Next());}
// Rättfor (int i = 0; i < 5; i++){ Console.WriteLine(Random.Shared.Next()); // Delar en instans}TL;DR
Random.Shared.Next(min, max) för enkel slump — övre gränsen exkluderas. Skapa en enda instans och återanvänd den. Sätt ett seed om du vill ha reproducerbara resultat.