Phương thức Random.NextDouble() trong C# được dùng để trả về một số thực ngẫu nhiên (double) lớn hơn hoặc bằng 0.0 và nhỏ hơn 1.0 (khoảng [0.0, 1.0)).
Cú pháp
public virtual double NextDouble();
Ví dụ 1: Sinh số thực ngẫu nhiên và so sánh với NextBytes
using System;
public class Demo
{
public static void Main()
{
Random r1 = new Random();
Random r2 = new Random();
Byte[] arr = new Byte[2];
r1.NextBytes(arr);
Console.WriteLine("Các số ngẫu nhiên trong mảng byte (NextBytes)...");
for (int i = 0; i < 2; i++)
{
Console.WriteLine(arr[i]);
}
Console.WriteLine("\nCác số thực ngẫu nhiên [0.0, 1.0) (NextDouble)...");
for (int i = 0; i < 5; i++)
{
Console.WriteLine(r2.NextDouble());
}
}
}
Kết quả (ví dụ)
Các số ngẫu nhiên trong mảng byte (NextBytes)... 124 141 Các số thực ngẫu nhiên [0.0, 1.0) (NextDouble)... 0.93591266727816 0.36406785872023 0.122396959514542 0.795166163144245 0.954394097884369
Ví dụ 2: Phân phối tần suất (histogram) với NextDouble
using System;
public class Demo
{
public static void Main()
{
int[] val = new int[7]; // 0-6, dùng index 1-5 cho 5 bucket
Random r = new Random();
double d;
// Sinh 50 số ngẫu nhiên, chia thành 5 bucket [0,0.2), [0.2,0.4)...
for (int i = 0; i < 50; i++)
{
d = r.NextDouble();
val[(int)Math.Ceiling(d * 5)]++;
}
Console.WriteLine("Các số ngẫu nhiên (thống kê bucket)...");
for (int i = 0; i < 7; i++)
{
Console.WriteLine("Bucket " + i + ": " + val[i]);
}
}
}
Kết quả (ví dụ)
Các số ngẫu nhiên (thống kê bucket)... Bucket 0: 0 Bucket 1: 13 Bucket 2: 9 Bucket 3: 12 Bucket 4: 8 Bucket 5: 8 Bucket 6: 0
Mở rộng phạm vi: [min, max)
NextDouble() chỉ sinh [0, 1). Để sinh trong [min, max):
double min = 10.5; double max = 20.5; double randomValue = min + (r.NextDouble() * (max - min)); // Kết quả trong [10.5, 20.5)
Lưu ý quan trọng
- Trả về
double(64-bit), độ chính xác ~15-17 chữ số. - Phân phối đồng đều (uniform distribution) trên [0, 1).
- Instance
Randomkhông thread-safe. DùngThreadLocal<Random>hoặclocknếu đa luồng. - Không dùng cho mật mã (cryptography). Dùng
RandomNumberGenerator. - Tạo một instance duy nhất và tái sử dụng.
So sánh Next(), Next(int), NextDouble()
| Phương thức | Kiểu trả về | Phạm vi |
|---|---|---|
Next() |
int | [0, Int32.MaxValue] |
Next(max) |
int | [0, max) |
Next(min, max) |
int | [min, max) |
NextDouble() |
double | [0.0, 1.0) |
NextBytes(byte[]) |
void | Điền mảng byte [0, 255] |