.net - F# System.Random 重复值
问题描述
我正在尝试在 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
在上面的代码中 bota
并b
获得相同的 id。
我猜正在发生的是它let r = System.Random()
不会被视为变量,而是作为返回随机新实例的函数。这个对吗?我该如何解决这个问题?
谢谢!
解决方案
您需要在 create 函数中传递一个 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(); }
推荐阅读
- python - 如何从合并的pdf文件中提取文本?
- sql - SQL - 截断(Oracle)日期 - 什么是未来的安全选项?
- amazon-web-services - 即使在添加了额外的 Kubernetes 节点之后,我看到新节点未使用,同时出现错误“没有与所有谓词匹配的节点可用:
- node.js - Socket.io being disconnected and connected when joining a room
- .net - F#:如何打印矩阵?
- python-3.x - 使用 gremlin-python Janus 进行社交网络应用
- git - 如何在 IntelliJ IDEA 2018.1 + Git 集成插件中通过 GUI 创建一个空提交?
- ios - 如何在应用程序运行时知道 vpn 是否开启?
- r - R:跨列表计算矩阵中的每个元素
- swift - Swift 4 UIActivityViewController 使用 AirDrop 发送图像