Глиф Учебники

Как получить случайное число — Random и Random.Shared

Справочник · C# · 2 минуты чтения

C#
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 и новее этого нет, но один генератор на всю программу — всё равно правильнее.

Случайный элемент и перемешивание

C#
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). Это удобно для отладки и тестов. Без зерна последовательность каждый раз новая.

Игра «Угадай число»

C#
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;
    }
}

Подводные камни