चूंकि System.Random अपने "गलतता" और पूर्वाग्रह के लिए यहाँ धराशायी है, इसलिए मैंने खुद की जाँच की।
वितरण
यह f # कोड दर्शाता है कि यह वास्तव में अच्छा व्यवहार करता है - मेरी औसत मशीन पर:
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)
फ्रेमवर्क संस्करण, मशीन, ऑपरेटिंग सिस्टम सभी में फर्क हो सकता है। अपनी मशीन पर F # इंटरेक्टिव में कोड दर्ज करें और स्वयं प्रयास करें। सीरपोग्राफी के लिए मैंने पढ़ा
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)
प्रदर्शन
#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
जो 1: 2 संबंध और क्रिप्टो संस्करण के कुछ हद तक अच्छे व्यवहार का सुझाव देता है।
निष्कर्ष
मुख्य रूप से इसके बहुत अच्छे एपीआई के लिए, कुछ हद तक इसके प्रदर्शन और काफी अच्छे वितरण के लिए, System.Random को पसंद किया जाता है। System.Random भी पुस्तकालय निर्भरता को कम कर सकता है और यदि एक रूपरेखा पोर्ट की जाती है, तो System.Random संभवतः क्रिप्टो वेरिएंट से पहले उपलब्ध होगा।