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
Randomsử 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ặclocknếu đa luồng. - Không dùng cho mục đích mật mã (cryptography). Dùng
RandomNumberGenerator(trongSystem.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));
}