【问题标题】:F# System.Random duplicate valuesF# System.Random 重复值
【发布时间】:2021-08-22 11:07:34
【问题描述】:

我正在尝试在 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

在上面的代码中,bot ab 获得了相同的 id。

我猜正在发生的事情是let r = System.Random() 不会被视为变量,而是作为返回随机新实例的函数。这个对吗?我该如何解决这个问题?

谢谢!

【问题讨论】:

标签: .net random f# random-seed


【解决方案1】:

您需要在 create 函数中传递一个单位 () 否则是一个值(仅在第一次计算)。

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(); }

【讨论】:

  • 是的,效果更好,谢谢!但我会按照你的建议做,并将其作为参数传递。
猜你喜欢
  • 1970-01-01
  • 2013-04-10
  • 2012-08-01
  • 1970-01-01
  • 2011-08-29
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多