Random
.NET类提供了两种方法:NextDouble
和Sample
。两个文件都返回,“双精度浮点数大于或等于0.0,小于1.0。” Sample
确实记录了一些关于如何从.NET 2.0开始的评论,它没有用于其他几种NextX
方法,但我不清楚它有什么影响。
那么这两种方法有什么区别?每种用途的用途是什么?更具体地说,如果我只是在0.0
和1.0
之间的均匀分布值之后,我应该使用哪个?
答案 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();
}