2011-02-28 233 views
3

我应该如何生成一个介于0到2之间的随机数?我应该如何生成0到2之间的随机数? BCL随机不是随机的

我目前正在使用一个私有静态只读随机对象,并调用_random.Next(0,2)但值不是随机的...我看到序列0,0,0,1,1,0,0 ,0,,1,1,1

下面显然不是随机的。我应该怎么做?

非常感谢

+2

看起来随机给我..... – 2011-02-28 11:45:35

+4

请解释你为什么认为它不是随机的..... – 2011-02-28 11:46:56

+1

这可能源于误解什么是随机的。我怀疑他/她希望它更统一。但好吧,它不是随机的,只是伪随机:) – Skurmedel 2011-02-28 11:47:40

回答

10

如果你的意思是你想随机数0或1,那么你在做什么已经是正确的。

如果你想要数字0,1或2,那么你需要写_random.Next(0, 3)

1

如果使用相同的种子初始化Random,您将得到相同的数字序列。这就是为什么它可能是一个好主意,使用基于时间的种子:

Random _random = new Random(DateTime.UtcNow.Millisecond); 

另外,还要注意在Next上限是独家。这意味着Next(0, 2)将总是只返回0或1(但这可能是你想要的;对于我来说这个问题有点不清楚)。

+0

默认构造函数使用基于时间的种子。不知道什么时间分辨率。另外,如果'DateTime。UtcNow.Milliseconds'就像Win32定时函数一样,它可能没有你想象的那么多的分辨率,这在创建多个Random的实例时可能是个问题。 – 2011-02-28 12:01:06

+0

@Merilyn:关于DateTime.UtcNow.Millisecond的解决方案,我不确定它(即使在我的机器上,它似乎实际上解决了每毫秒,有点令人惊讶的是,我期望看到每个15毫秒左右的地方或所以);我只用它作为基于时间的种子的一个简单例子。 – 2011-02-28 12:12:48

3

您已经在以正确的方式进行操作(只要您对伪随机数的要求不包括加密安全性)。

问题是随机性在统计上是确定的(使用数学),不直观地确定(使用你的眼睛)。

例如,即使您的随机数序列是一致随机的,给定了一个无限序列的随机数,您仍然可以看到连续数十万个1。

this Wikipedia article on Pseudorandom Number Generators

如果你试图让数字“0,1,2”,那么你可能需要您的来电更改为random.Next(0, 3)。如果你确实只想要0和1,那么保持原样。另外,如果您在代码的多个位置创建Random的实例,则可能会得到相同的种子,因此会得到相同的随机数序列。避免这种情况的一种方法是在这两段代码之间重用Random类的实例,而不是创建新实例。

1

maxValue是“包含和不包含”。如果你想包括2,只需写_random.Next(0,3)