F# System.Random 重复值
F# System.Random duplicate values
我正在尝试在 F# 中使用 System.Random,但总是出现重复值。我知道如果我每次都创建一个 System.Random 的新实例。接下来我可能会得到重复的值。我想要实现的是在创建记录时在每条记录上设置一个随机 ID。这是代码中的问题示例:
[<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
在上面的代码中,机器人 a
和 b
获得相同的 ID。
我猜测正在发生的事情是 let r = System.Random()
没有被视为变量,而是被视为 returns Random 的新实例的函数。这个对吗?我该如何解决这个问题?
谢谢!
您需要在创建函数中传递一个 unit () 否则是一个值(仅在第一次计算)。
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" b
这会产生不同的值。
a = { id = 1528807395 }
b = { id = 1526175776 }
这解决了您眼前的问题。但是,通常的做法是创建无状态函数。您的 Random 变量包含状态,因此必须将其作为参数传递。
let create (r:Random) =
{id = r.Next(); }
我正在尝试在 F# 中使用 System.Random,但总是出现重复值。我知道如果我每次都创建一个 System.Random 的新实例。接下来我可能会得到重复的值。我想要实现的是在创建记录时在每条记录上设置一个随机 ID。这是代码中的问题示例:
[<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
在上面的代码中,机器人 a
和 b
获得相同的 ID。
我猜测正在发生的事情是 let r = System.Random()
没有被视为变量,而是被视为 returns Random 的新实例的函数。这个对吗?我该如何解决这个问题?
谢谢!
您需要在创建函数中传递一个 unit () 否则是一个值(仅在第一次计算)。
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" b
这会产生不同的值。
a = { id = 1528807395 }
b = { id = 1526175776 }
这解决了您眼前的问题。但是,通常的做法是创建无状态函数。您的 Random 变量包含状态,因此必须将其作为参数传递。
let create (r:Random) =
{id = r.Next(); }