Как получить случайное число — Random и Random.Shared
Random rnd = new Random();
int dice = rnd.Next(1, 7);
Console.WriteLine($"Кубик: {dice}");
int percent = Random.Shared.Next(101);
Console.WriteLine($"Процент: {percent}");rnd.Next(1, 7) даёт целое от 1 до 6: нижняя граница входит, верхняя — нет. Поэтому для кубика пишут 7, а для чисел от 1 до 100 — Next(1, 101).
Варианты Next
| Вызов | Что даёт |
|---|---|
Next() | целое от 0 до int.MaxValue (не включая его) |
Next(n) | от 0 до n - 1 |
Next(a, b) | от a до b - 1 |
NextDouble() | дробное от 0 (включая) до 1 (не включая) |
NextInt64(a, b) | как Next, но для long |
Дробное в своём диапазоне — через NextDouble: double x = 5 + rnd.NextDouble() * 10; — от 5 до 15.
Random.Shared
Random.Shared (.NET 6 и новее) — готовый общий генератор, создавать свой не нужно: Random.Shared.Next(1, 7). Его можно безопасно вызывать из нескольких потоков (частей программы, которые выполняются одновременно), а обычный объект Random — нет.
Если создаёте свой Random, создайте его один раз и пользуйтесь им, а не пишите new Random() на каждое число. В старом .NET Framework объекты, созданные почти одновременно, выдавали одинаковые числа; в .NET 8 и новее этого нет, но один генератор на всю программу — всё равно правильнее.
Случайный элемент и перемешивание
string[] colors = { "красный", "зелёный", "синий" };
string color = colors[Random.Shared.Next(colors.Length)];
Console.WriteLine(color);
int[] cards = { 1, 2, 3, 4, 5, 6 };
Random.Shared.Shuffle(cards);
Console.WriteLine(string.Join(" ", cards));Next(colors.Length) даёт индекс от 0 до Length - 1 — ровно столько, сколько есть элементов. Shuffle перемешивает массив на месте; он появился в .NET 8.
Одинаковая последовательность: зерно
new Random(42) — генератор с зерном 42: при каждом запуске он выдаёт одну и ту же последовательность чисел (в одной и той же версии .NET). Это удобно для отладки и тестов. Без зерна последовательность каждый раз новая.
Игра «Угадай число»
int secret = Random.Shared.Next(1, 101);
int tries = 0;
Console.WriteLine("Загадано число от 1 до 100");
while (true)
{
Console.Write("Ваш вариант: ");
string? line = Console.ReadLine();
if (line == null)
{
break;
}
if (!int.TryParse(line, out int guess))
{
Console.WriteLine("Нужно целое число");
continue;
}
tries++;
if (guess < secret)
{
Console.WriteLine("Больше");
}
else if (guess > secret)
{
Console.WriteLine("Меньше");
}
else
{
Console.WriteLine($"Угадано! Попыток: {tries}");
break;
}
}Подводные камни
Next(1, 6)никогда не даст 6 — верхняя граница не входит.Randomне годится для паролей, кодов подтверждения и всего, что связано с защитой: его числа можно предсказать. Для этого естьRandomNumberGenerator.GetInt32(1, 101)изSystem.Security.Cryptography— с той же невключённой верхней границей.- В Unity — свой генератор
UnityEngine.Random.Range(min, max): для целых верхняя граница не входит, для дробных — входит. Если в скрипте подключены иSystem, иUnityEngine, имяRandomстановится неоднозначным — пишите полностью:UnityEngine.Random.Range(0, 10).