【问题标题】:MathNet. RandomSource数学网。随机源
【发布时间】:2015-09-23 01:23:04
【问题描述】:

.Net 包“MathNet.Numerics.Distributions”包含一个方法Normal(double mean, double stddev, Random randomSource)

前两个参数是double,可以轻松设置。但是第三个参数Random randdomSource 就麻烦了。

有人知道在Normal(double mean, double stddev, Random randomSource) 中设置并使用它吗?

【问题讨论】:

    标签: c# .net math.net mathnet-numerics


    【解决方案1】:

    正如其他人已经回答的那样,使用没有第三个参数的构造函数,即Normal(double mean, double stddev)

    在处理随机来源和分布时,我们建议遵循以下规则:

    • 随机源仅用于对具有分布的随机数进行抽样。如果您不需要生成随机数,请不要提供随机源,而是使用没有随机源的构造函数重载。
    • 如果您确实需要使用分布生成随机数,仅当您出于某种原因不想使用默认随机源时才提供随机源。如果默认值没问题(本质上是 System.Random 的安全包装器),请使用没有的构造函数重载
    • 将 System.Random 实例传递给 Math.NET Numerics 时要小心。考虑改用线程安全的 SystemRandomSource。

    另见:

    【讨论】:

      【解决方案2】:

      试试这个:

      var randomSource = new Random();
      

      不过,最佳做法是在任何应用程序中只创建一个 Random 实例 - 这是为了避免创建多个共享相同随机种子的 Random 实例。

      所以你最好这样做:

      public static class Global
      {
          [ThreadStatic] public static readonly Random Random = new Random();
      }
      

      然后你会这样调用你的方法:

      Normal(0.0, 1.0, Global.Random);
      

      【讨论】:

      • 虽然您需要小心处理 Random 实例及其种子是正确的,但在使用 Math.NET Numerics 时请不要这样做。这将导致您出现线程问题,并且没有随机源参数的重载的默认行为已经以更好的方式处理了这个问题。
      • @ChristophRüegg - 这会导致什么线程问题?尽管如此,我还是更新了我的答案,以帮助避免线程问题。
      • Math.NET 中的一些高阶函数假定提供的 lambda 是一个纯函数,并且可以从多个线程调用它,例如在具有非常大矩阵的线性代数中。当用作此类 lambda 的一部分时,ThreadStatic 将无济于事。但是感谢您的更新!
      猜你喜欢
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多