Estoy tratando de usar System.Random en F # pero sigo obteniendo valores duplicados. Soy consciente de que si creo una nueva instancia de System.Random cada vez que lo hago. A continuación, podría obtener valores duplicados. Lo que estoy tratando de lograr es establecer una identificación aleatoria en cada registro al crearlos. Aquí hay un ejemplo del problema en el código:
[<AutoOpen>] module Domain = type Test = {id: int; ....} module Test = let r = System.Random() let t create = {id = r.Next(); ....} let a = Test.create let b = Test.create En el código anterior, bot a y b obtienen la misma identificación.
Lo que supongo que está sucediendo es que let r = System.Random() no se trata como una variable sino como una función que devuelve una nueva instancia de Random. ¿Es esto correcto? ¿Y cómo puedo solucionar este problema?
¡Gracias!
Debe pasar una unidad () en su función de creación; de lo contrario, es un valor (que solo se calcula la primera vez).
open System module T = type Test = {id: int; } let r = System.Random() let create () = {id = r.Next(); } [<EntryPoint>] let main _ = let a = T.create () let b = T.create () printfn "a = %A" a printfn "b = %A" bEsto produce diferentes valores.
a = { id = 1528807395 } b = { id = 1526175776 }Esto resuelve su problema inmediato. Sin embargo, es una práctica común crear funciones sin estado. Su variable aleatoria contiene estado, por lo que debe pasarse como parámetro.
let create (r:Random) = {id = r.Next(); }