这是一个正确的线程安全随机包装器吗?

2024-03-13

我对线程和并发相当缺乏经验;为了解决这个问题,我目前正致力于在 F# 中实现随机搜索算法。我遵循现有 C# 示例的想法,围绕 System.Random 类编写了一个包装器 - 但由于我不确定如何开始对其错误行为进行单元测试,所以我想听听更有经验的人怎么说,如果我的代码有明显的缺陷或改进,无论是由于 F# 语法还是线程误解:

open System
open System.Threading

type Probability() =

   static let seedGenerator = new Random()

   let localGenerator = 
      new ThreadLocal<Random>(
         fun _ -> 
            lock seedGenerator (
               fun _ -> 
                  let seed = seedGenerator.Next()
                  new Random(seed)))

   member this.Draw() = 
      localGenerator.Value.NextDouble()

我对此的理解是:ThreadLocal 确保对于一个实例,每个线程接收自己的 Random 实例,并由公共静态 Random 提供自己的随机种子。这样,即使该类的多个实例在很短的时间内创建,它们也会收到自己的种子,从而避免“重复”随机序列的问题。该锁强制任何两个线程都不会获得相同的种子。

这看起来正确吗?有明显的问题吗?


我认为你的方法非常合理 - 使用ThreadLocal让您安全地访问Random并使用master提供种子的随机数生成器意味着即使您同时从多个线程访问它,您也会获得随机值。从加密意义上来说,它可能不是随机的,但对于大多数其他应用程序来说应该没问题。

至于测试,这是相当棘手的。如果Random中断时,它会一直返回 0,但这只是经验,很难说你需要继续不安全地访问它多长时间。我能建议的最好的事情是实施一些简单的随机性测试(一些维基百科上有简单的 http://en.wikipedia.org/wiki/Statistical_randomness#Tests)并从循环中的多个线程访问您的类型 - 尽管这仍然是一个非常糟糕的测试,因为它可能不会每次都失败。

除此之外,你不需要使用type来封装这种行为。它也可以写成一个函数:

open System
open System.Threading

module Probability =

   let Draw =
     // Create master seed generator and thread local value
     let seedGenerator = new Random()
     let localGenerator = new ThreadLocal<Random>(fun _ -> 
       lock seedGenerator (fun _ -> 
         let seed = seedGenerator.Next()
         new Random(seed)))
     // Return function that uses thread local random generator
     fun () ->
       localGenerator.Value.NextDouble()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是一个正确的线程安全随机包装器吗? 的相关文章

  • sklearn.model_selection.train_test_split 示例中的“随机状态”是什么? [复制]

    这个问题在这里已经有答案了 有人能给我解释一下吗random state在下面的例子中意味着什么 import numpy as np from sklearn model selection import train test split
  • 如何使用 LOCK ASM 前缀来读取值?

    我知道如何使用 LOCK 来线程安全地递增一个值 lock inc J 但是如何以线程安全的方式读取 J 或任何值 LOCK 前缀不能与 mov 一起使用 如果我执行以下操作 xor eax eax lock add eax J mov J
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • PHP随机输出数组元素

    我如何从大约 20 个元素的数组中随机回显 5 个元素 Thanks 这有效吗 values array rand input 5 或者 作为更灵活的功能 function randomValues input num 5 return a
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 同步和线程安全这两个术语是什么意思? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我看了很多关于数据结构的视频 总是提到这些术语 synchronized not synchronized and thread sa
  • 如何在 Swift 中生成随机数?

    我意识到 Swift 书提供了随机数生成器的实现 最佳实践是复制并粘贴此实现吗 或者有一个库可以做到这一点 我们现在可以使用吗 斯威夫特 4 2 Xcode 10 附带的 Swift 4 2 为许多数据类型引入了新的易于使用的随机函数 您只
  • F# 生成日期序列/数组

    在 F 中我可以轻松做到 let a 1 10 那我为什么不能做 let a DateTime Parse 01 01 2012 let b DateTime Parse 01 01 2020 let dateList a b 它给出了一个
  • F# 方法返回 null 而不是 Option

    我开发F 应用 net 4 6 1 on VS2015 我有方法 type CommonHelper static member SideEffectOnNull act x if x null then act x else x stat
  • 随机字符串生成器产生相同结果的问题

    我使用随机字符串生成器 基于此 http stackoverflow com questions 1344221 how can i generate random 8 character alphanumeric strings in c
  • 何时使用接口,何时使用高阶函数?

    给定一个具有以下层的 ASP NET MVC 应用程序 UI 视图 CSS Javascript 等 控制器 服务 包含业务逻辑和数据访问 没有单独的数据访问层的原因是我正在使用 SQL 类型提供程序 以下代码可能不起作用 因为它只是原始草
  • 如何使用反射来确定 F# 联合类型是否是类似枚举的联合(每种情况下都没有字段)

    术语 在下面的文章中 我将使用术语 引用枚举 来指代 F 类型 该类型是在每种情况下都没有字段的可区分联合 例如 type AReferenceEnum Yes No Maybe 要求 我需要一个给定的函数Type 返回一个bool告诉类型
  • REST - 获取随机数 GET 还是 POST?

    应该如何在 REST 中正确实现随机数生成器 GET RANDOM or POST RANDOM 服务器每次返回不同的随机数 我可以看到这两种方式的论点 我想说这与返回的包含当前时间的页面相同 其中许多都是使用 GET 完成的 抽象地说 获
  • 使用 python 中的硬件 rng

    是否有任何现成的库 以便 numpy 程序可以使用 intel 硬件 prng rdrand 来填充随机数缓冲区 如果做不到这一点 有人可以为我指明一些我可以改编或使用的 C 代码的正确方向 我将 CPython 和 Cython 与 nu
  • 我可以提供类型作为 F# 中类型提供程序的输入吗?

    这样做有什么我应该注意的陷阱吗 您知道处理我可能遇到的相同 pb 的现有代码吗 Thks 不幸的是 您无法将类型作为静态参数传递给类型提供程序 使用传递的静态参数MyProvider lt first argument 42 gt 必须是原
  • 创建一个具有相同定义域和值域的随机双射函数

    创建一个具有相同定义域和值域的随机双射函数 我所说的随机双射函数是指使用随机算法 或至少是伪随机算法 将元素从域映射到范围的函数 而不是像 x y 这样的函数 域和范围有时可能是一个非常小的集合 例如 1 2 3 4 5 因此配对函数将不起
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • ASP.NET 开发人员真的需要关心线程安全吗?

    我认为自己了解线程的概念以及为什么某些代码是或不是 线程安全 的 但作为主要使用 ASP NET 的人 线程和线程安全是我很少考虑的事情 然而 我似乎在 Stack Overflow 上遇到了大量评论和答案 不一定适用于 ASP NET 大
  • 在 Excel 中生成随机 -1 和 +1 值

    The Rand 函数会生成一个 0 到 1 之间的实数 这Randbetween 1 1 将生成 1 0 或 1 我想要的只是 1或1 那么 1 到 1 之间的实数呢 Easy IF RAND lt 0 5 1 1 要获得实数 请使用 R
  • F#:仅对第一个事件执行一次操作,没有可变性/锁定?

    我有这段代码 可以下载文件并在控制台中告诉我该文件有多大 use webClient new WebClient let lockObj new Object let mutable firstProgressEvent true let

随机推荐

  • 向不记名令牌 json 添加更多值

    我想在用户成功登录后返回用户名 以显示在我的网络应用程序的右上角 我想用令牌返回的 json 来发送它 为了生成令牌身份验证 我使用 ASP NET Web API 和 Owin middlehawe access token blah t
  • 如何在Chrome devtools元素检查器中搜索标签+属性?

    我在 devtool 中进行了简单的搜索 但它无缘无故地急剧下降 更重要的是 如果我查看源代码并进行相同的搜索 结果数 link rel link contains rel style 或 CSS 选择器 link rel link rel
  • Windows 窗体 ListView 缺少水平滚动条

    我在表单 C VS 2005 中有一个 Windows 窗体 ListView 并将其锚定到表单的所有边缘 以便它完全填充表单 不包括状态栏 ListView 处于详细模式 并且列非常宽 绝对比显示区域宽 我有一个垂直滚动条 但没有水平滚动
  • 将记录作为函数结果从 Delphi DLL 传递到 C++

    我现在正在经历一些非常奇怪的事情 当我将结构从 C 传递到 Delphi DLL 作为参数时 一切正常 但是 一旦我想收到结果记录 我要么得到错误的值 要么得到异常 我禁用了记录的对齐 以便通过它们应该可以 这是代码 德尔福动态链接库 TS
  • jQueryUI Datepicker 上一个和下一个图标不显示

    我已将 jquery datepicker 合并到我的应用程序中 但是无论我选择什么主题 上一个 下一个图标都不会显示 我也使用了不同版本的 jquery ui js 我尝试了一些我之前看到过的项目 例如 使用 hideIfNoPrevNe
  • 需要有关将代码转换为 Matlab_extension 1 的建议

    这是之前提出的问题的扩展 link https stackoverflow com questions 20851902 need suggestion on code conversion to matlab noredirect 1 c
  • 在 Android 屏幕上显示通知

    我正在使用此代码发送本地通知 mNotificationManager NotificationManager getSystemService Context NOTIFICATION SERVICE PendingIntent cont
  • 如何在每页显示子报表的标题?

    我需要在C1Report设计器中设置什么属性才能在每个新页面上显示我的子报表的标题 Repeat true 设置该属性后 子报表不会在每个新页面上显示标题 它确实工作得很好Main Report tho 您需要在子报表的主键字段上添加分组
  • SSL_CTX_load_verify_locations 失败并显示 SSL_ERROR_NONE

    我到处搜索 但没有找到这个问题的解释 我正在运行以下命令 int ret 0 ERR clear error ret SSL CTX load verify locations ctx f 50 server SSLCACertificat
  • 如何在 Groovy 2.4 中计算 sha256 哈希值

    我正在尝试计算 Groovy 版本 2 4 16 中的 sha256 哈希值 这是 jmeter 测试的一部分 这是它支持的 Groovy 版本 我认为我无法更改它 我知道在 Groovy 2 5 中你可以使用这样的代码 https mrh
  • 如何使用javascript填写表单字段并提交?

    如果我有一个 html 文档 其大致结构是 div class headerstuff stuff div div class body div
  • 使用三元运算符而不是 IF THEN 有什么意义? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何实现全屏模式?

    在 Windows 操作系统下运行的应用程序如何实现像 Web 浏览器一样的全屏模式 它比最大化窗口和隐藏窗口装饰更复杂吗 表单样式 无 最大化 如果您指定语言 您可能会获得一些示例代码 EDIT 回应什么格雷格发布 https stack
  • 使用 ggplot2 中的 stat_poly_eq 指定每个方面的公式

    我借用了这个示例数据集here https stackoverflow com questions 44912496 geom smooth with facet grid and different fitting functions L
  • 异步方法恢复后值未更新

    看这段代码 public class SharedData public int Value get set void button1 Click object sender EventArgs e AAA async Task BBB S
  • Mercurial 卡在“等待锁定”状态

    克隆 Mercurial 存储库时 Windows 出现蓝屏 重新启动后 我现在几乎所有 hg 命令都会收到此消息 c src gt hg commit waiting for lock on repository c src McVrsS
  • 在比较四个字符的字符串时,有什么简单的方法可以检查两个或多个字符是否相等?

    我必须比较两个字符串 例如INTU and IXTE并检查两个或多个字符是否相同 对于前两个字符串 我想返回true 因为 I 和 T 相同 字符串中字母的顺序最终无关紧要 因为每个字符不能出现在字符串中的不同位置 似乎应该有一个简单的方法
  • 使用 dplyr 根据最大​​行值添加新列?

    我有一个大型数据库 其中包含一系列带有数字的列 我想用dplyr添加新列 mutate 其值是具有最大值的列的名称 所以 对于下面的例子 set seed 123 data frame bob rnorm 10 sam rnorm 10 d
  • 此计算机上未安装 Azure CLI 2.x

    我正在尝试使用 az storage blob upload batch 上传 blob 我遇到了以下两个例外 错误 此计算机上未安装 Azure CLI 2 x 错误 脚本失败 出现错误 错误 无法找到可执行文件 pwsh 请验证文件路径
  • 这是一个正确的线程安全随机包装器吗?

    我对线程和并发相当缺乏经验 为了解决这个问题 我目前正致力于在 F 中实现随机搜索算法 我遵循现有 C 示例的想法 围绕 System Random 类编写了一个包装器 但由于我不确定如何开始对其错误行为进行单元测试 所以我想听听更有经验的