使用Random.Next()的概率

vaj*_*oja 2 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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

Lia*_*ath 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在那里,您可能需要适当调整您的代码.

  • @FelixLahmer:您是否阅读过Liath链接的网站?请注意,有可用的硬件模块使用放射性衰变等.据我所知,放射性衰变仍然被认为是随机的 - 或者至少是人类无法预测的.仅仅因为*许多*系统使用时间戳并不意味着所有可用的时间戳. (2认同)
  • @FelixLahmer:不知道如何计算这些值不会使它随机 - 但它也不会使它*不随机.有证据表明放射性衰变不是*随机的吗?(当然,对于*实用*目的,彻底的不可预测性几乎总是足够好.) (2认同)