使用Random.Next()的概率

时间:2014-02-28 09:08:29

标签: c# random

我想写一个彩票抽奖程序,需要从1-2000000范围内随机选择20000个数字。代码如下:

Random r = New Random(seed); //seed is a 6 digits e.g 123456
int i=0;
while(true){
   r.Next(2000000);
   i++;
   if(i>=20000)
      break;
}

我的问题是:

  1. 能否确保所有数字从1到2000000的相同可能性?
  2. r.Next()中是否包含上限2000000?
  3. 有什么建议吗?

4 个答案:

答案 0 :(得分:6)

.NET Random类在生成随机数方面做得相当不错。但请注意,如果您使用相同的数字播种,则每次都会获得相同的“随机”数字。如果您不希望此行为,请不要提供种子。

如果您使用的是比内置.NET更多的随机数生成器,那么请查看random.org。这是获得真正随机数的最佳网站之一 - 我相信有一个API。以下是他们网站的引用:

  

RANDOM.ORG为互联网上的任何人提供真正的随机数。该   随机性来自大气噪声,这在很多方面都是如此   优于通常使用的伪随机数算法   电脑程序。人们使用RANDOM.ORG来保存图纸,   彩票和抽奖,驾驶游戏和赌博网站,为   科学应用以及艺术和音乐。该服务已存在   自1998年以来,由计算机学院的Mads Haahr博士建造   爱尔兰都柏林三一学院的科学与统计学。今天,   RANDOM.ORG由Randomness and Integrity Services Ltd.运营。

最后,Random.Next()为exlusive,因此永远不会调用您提供的上限值。如果你想要2000000,你可能需要适当调整你的代码。

答案 1 :(得分:2)

它包含 minValue ,但不包含 maxValue 。因此,如果要生成1到2000000之间的数字,请使用:

r.Next(1,2000001)

答案 2 :(得分:0)

我相信你的问题取决于实施。

在一个范围内生成随机整数的天真方法是生成一个随机的32位字,然后在整个范围内对其进行标准化。

您正常化的范围越大,每个值的概率波动越大。

在您的情况下,您将超过200万输出的43亿输入正常化。这意味着您范围内每个数字的概率在2000年(或0.05%)差异最多约为1。如果你的概率略有不同,那就继续吧。

答案 3 :(得分:0)

  • 包含上限?

不,上限为独占,因此您必须使用2000001来包含2000000。

  • 有什么建议吗?

让我冒昧地建议不要使用while(true) / break。只需将if的条件放在while语句中:

Random r = New Random(seed); //seed is a 6 digits e.g 123456
int i=0;

while(i++ < 20000)
{
    r.Next(1, 2000001);
}

我知道这是挑剔,但一个建议......:)