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

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

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 Random không thread-safe. Dùng ThreadLocal<Random> hoặc lock nế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]