NextDouble和Sample之间的区别:我应该使用哪个?

时间:2014-06-30 21:36:22

标签: c# random

Random .NET类提供了两种方法:NextDoubleSample。两个文件都返回,“双精度浮点数大于或等于0.0,小于1.0。” Sample确实记录了一些关于如何从.NET 2.0开始的评论,它没有用于其他几种NextX方法,但我不清楚它有什么影响。

那么这两种方法有什么区别?每种用途的用途是什么?更具体地说,如果我只是在0.01.0之间的均匀分布值之后,我应该使用哪个?

4 个答案:

答案 0 :(得分:3)

Sample是受公保的NextDouble方法(以及Next的某些重载)调用的受保护方法。可以覆盖提供“随机”数字的非默认分布。

因此,你可以“使用”Sample的唯一方法是派生类(或反射)。如果你没有覆盖 Sample那么两者之间没有区别。

答案 1 :(得分:2)

  

示例确实记录了一些关于如何从.NET 2.0开始的注释,它没有用于其他几个NextX方法,但我不清楚它有什么含义。

它说:

  

如果Random派生类并覆盖Sample方法,则不会使用Sample方法的派生类实现提供的分布< / strong>调用[...] Random.Next() [...]

的基类实现

这可以从reference source

中看到
public virtual int Next() {
    return InternalSample();
}

与:相比:

public virtual double NextDouble() {
    return Sample();
}

由于Sample()被声明为protected virtual,这意味着您可以创建派生类并覆盖它:

public class VeryRandom : Random
{
    protected override double Sample()
    {
        return 4;
    }
}

现在,如果您拨打Next(),它将来自基类,而NextDouble()将返回4

关于您的问题:只要您不覆盖Sample()NextDouble() 调用 Sample()就没有区别,但您可以'在Sample()实例上调用Random,因为它受到保护而非公开。

答案 2 :(得分:1)

NextDouble只是示例方法的公共版本。没别的差别。这就是文档所说的内容。

  

Sample方法受到保护,这意味着它只能访问   在Random类及其派生类中。生成随机   从Random实例中0到1之间的数字,调用NextDouble   方法

NextDouble的文档明确指出

  

此方法是受保护方法的公共版本Sample。

答案 3 :(得分:0)

.NET source code,它们看起来完全一样,除了一个是受保护的,一个是公共的:

  protected virtual double Sample() {
      //Including this division at the end gives us significantly improved
      //random number distribution.
      return (InternalSample()*(1.0/MBIG));
  }

  public virtual double NextDouble() {
    return Sample();
  }