Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức Random.Next() trong C#

Phương thức Random.Next() trong C# được dùng để trả về một số nguyên ngẫu nhiên không âm. Có các nạp chồng cho phép giới hạn phạm vi sinh số.

Cú pháp

public virtual int Next();
public virtual int Next(int maxValue);
  • maxValue: Giới hạn trên không bao gồm (exclusive upper bound) của số ngẫu nhiên. Số sinh ra sẽ trong khoảng [0, maxValue).

Ví dụ 1: Sinh số ngẫu nhiên không giới hạn

using System;

public class Demo
{
    public static void Main()
    {
        Random r = new Random();

        Console.WriteLine("Các số ngẫu nhiên.....");
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine(r.Next());
        }
    }
}

Kết quả (ví dụ)

Các số ngẫu nhiên.....
1014639030
1510161246
1783253715
487417801
249480649

Ví dụ 2: Sinh số trong phạm vi [0, 10)

using System;

public class Demo
{
    public static void Main()
    {
        Random r = new Random();
        Random r2 = new Random();

        Console.WriteLine("Các số ngẫu nhiên.....");
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine(r.Next());
        }

        Console.WriteLine("\nCác số ngẫu nhiên từ 0 đến 9.....");
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine(r2.Next(10)); // 0 đến 9
        }
    }
}

Kết quả (ví dụ)

Các số ngẫu nhiên.....
613432308
1705125884
1787561614
1243383842
2016323534

Các số ngẫu nhiên từ 0 đến 9.....
2
7
8
5
9

Nạp chồng quan trọng khác

public virtual int Next(int minValue, int maxValue);

Sinh số trong khoảng [minValue, maxValue). Ví dụ: r.Next(1, 11) sinh số từ 1 đến 10.

Lưu ý quan trọng về Random

  • Random sử dụng seed dựa trên thời gian hệ thống. Tạo nhiều instance liên tiếp có thể cho cùng seed → cùng dãy số.
  • Không an toàn cho luồng (thread-safe). Dùng ThreadLocal<Random> hoặc lock nếu đa luồng.
  • Không dùng cho mục đích mật mã (cryptography). Dùng RandomNumberGenerator (trong System.Security.Cryptography).
  • Tạo một instance duy nhất và tái sử dụng thay vì tạo mới liên tục.

Ví dụ đúng (tái sử dụng instance)

static readonly Random _rng = new Random();

public int GetRandom(int min, int max) => _rng.Next(min, max);

Ví dụ sai (tạo mới liên tục)

// Sai: có thể trả về cùng số nếu gọi nhanh
for (int i = 0; i < 10; i++)
{
    var r = new Random();
    Console.WriteLine(r.Next(100));
}