Cần một bộ tạo số ngẫu nhiên mà trả về một mẫu từ một (Gaussian) phân phối bình thường, tôi đã chuyển đến F # một phần của John D. Cook's C# generator:Chủ đề an toàn trong F #
let mutable m_w = 521288629u
let mutable m_z = 362436069u
let private getUint() =
m_z <- 36969u * (m_z &&& 65535u) + (m_z >>> 16)
m_w <- 18000u * (m_w &&& 65535u) + (m_w >>> 16)
(m_z <<< 16) + m_w
let private setSeed() =
let dt = System.DateTime.Now
let x = dt.ToFileTime()
m_w <- uint32 (x >>> 16)
m_z <- uint32 (x % 4294967296L)
let private getUniform() =
let u = getUint()
(float u + 1.) * 2.328306435454494e-10
let private randomNormal() =
let u1 = getUniform()
let u2 = getUniform()
let r = sqrt (-2. * (log u1))
let theta = 2. * System.Math.PI * u2
r * sin (theta)
/// Returns a normal (Gaussian) random sample with mean 0 and standard deviation 1
let randn() =
setSeed()
randomNormal()
/// Returns an array of normal (Gaussian) random samples
let randns n m =
setSeed()
[| for i in 0 .. n - 1 -> randomNormal() |]
thi này hoạt động tốt nhưng không phải là chủ đề an toàn. Cho rằng mã phụ thuộc vào nó làm cho việc sử dụng rộng rãi Thư viện song song luồng, tôi cần phải làm cho chuỗi đó an toàn.
Điều này không rõ ràng đối với tôi vì cốt lõi của phương pháp là hai thành viên có thể thay đổi được khá nhiều không thể thiếu. Có cách nào khác để đạt được an toàn luồng mà không cần đến khóa không?
Có cách nào khác để triển khai trình tạo giả ngẫu nhiên bình thường chỉ sử dụng các thành viên không thay đổi được không?
Thực hiện cuộc gọi không tốt khi gọi điện thoạiSeed mỗi lần, giám sát ngu ngốc –
Tôi thích ý tưởng này. Bạn có thể vui lòng xây dựng trên tùy chọn biểu thức tính toán (Tôi không quen với khái niệm này)? –
Nó sẽ trông giống như: 'rnd { cho phép! a = GetNext 10; hãy để! b = GetExponential 2.5; hãy để! c = GetNormal; trả về a, b, c } ' – IngisKahn