我想写一个彩票抽奖程序,需要从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;
}
我的问题是:
r.Next()
中是否包含上限2000000? 答案 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);
}
我知道这是挑剔,但是一个建议......:)