Vì System.Random bị đánh cắp ở đây vì "tính không chính xác" và thiên vị, tôi đã tự kiểm tra.
phân phối
Mã f # này chứng tỏ rằng nó hoạt động rất tốt - trên máy trung bình của tôi:
let r = System.Random()
Seq.init 1000000 (fun _ -> r.Next(0,10))
|> Seq.toList
|> Seq.groupBy id
|> Seq.map (fun (v,ls) -> v, ls |> Seq.length)
|> Seq.sortBy fst
|> Seq.iter (printfn "%A")
(0, 100208)
(1, 99744)
(2, 99929)
(3, 99827)
(4, 100273)
(5, 100280)
(6, 100041)
(7, 100001)
(8, 100175)
(9, 99522)
Tất cả các phiên bản khung, máy, hệ điều hành đều có thể tạo ra sự khác biệt. Nhập mã trong F # tương tác trên máy của bạn và tự thử. Đối với Cyrptography tôi đã đọc
let arr = [| 0uy |]
let rr = System. Security.Cryptography.RandomNumberGenerator.Create()
Seq.init 1000000 (fun _ -> rr.GetBytes(arr); arr.[0])
|> Seq.toList
|> Seq.groupBy id
|> Seq.map (fun (v,ls) -> v, ls |> Seq.length)
|> Seq.sortBy fst
|> Seq.take 10
|> Seq.iter (printfn "%A")
(0uy, 3862)
(1uy, 3888)
(2uy, 3921)
(3uy, 3926)
(4uy, 3948)
(5uy, 3889)
(6uy, 3922)
(7uy, 3797)
(8uy, 3861)
(9uy, 3874)
hiệu suất
#time
let arr = [| 0uy |]
let r = System.Random()
Seq.init 1000000 (fun _ -> r.NextBytes(arr); arr.[0] |> int64) |> Seq.sum
Real: 00:00:00.204, CPU: 00:00:00.203, GC gen0: 45, gen1: 1, gen2: 1
val it : int64 = 127503467L
let rr = System. Security.Cryptography.RandomNumberGenerator.Create()
Seq.init 1000000 (fun _ -> rr.GetBytes(arr); arr.[0] |> int64) |> Seq.sum
Real: 00:00:00.365, CPU: 00:00:00.359, GC gen0: 44, gen1: 0, gen2: 0
val it : int64 = 127460809L
điều này gợi ý mối quan hệ 1: 2 và hành vi bộ nhớ tốt hơn một chút của phiên bản tiền điện tử.
phần kết luận
Chủ yếu là vì API đẹp hơn nhiều của nó, phần nào là hiệu suất và khả năng phân phối khá tốt, System.Random được ưa thích hơn. System.Random cũng có thể giảm bớt sự phụ thuộc của thư viện và nếu một khung công tác được chuyển, System.Random có thể sẽ có sẵn trước biến thể Crypto.