簡體   English   中英

使用Random.Next()的概率

[英]Probability with Random.Next()

我想寫一個彩票抽獎程序,需要從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. 有什么建議嗎?

.NET Random類在生成隨機數方面做得相當不錯。 但請注意,如果您使用相同的數字播種,則每次都會獲得相同的“隨機”數字。 如果您不希望此行為不提供種子。

如果您使用的是比內置.NET更多的隨機數生成器,那么請看一下random.org 這是獲得真正隨機數的最佳網站之一 - 我相信有一個API。 以下是他們網站的引用:

RANDOM.ORG為互聯網上的任何人提供真正的隨機數。 隨機性來自大氣噪聲,對於許多目的而言,其優於通常在計算機程序中使用的偽隨機數算法。 人們使用RANDOM.ORG舉辦繪畫,彩票和抽獎活動,駕駛游戲和賭博場所,科學應用以及藝術和音樂。 該服務自1998年以來一直存在,由愛爾蘭都柏林三一學院計算機科學與統計學院的Mads Haahr博士建造。 今天,RANDOM.ORG由Randomness and Integrity Services Ltd.運營。

最后,Random.Next()是exlusive,因此永遠不會調用您提供的上限值。 如果您希望2000000在那里,您可能需要適當調整您的代碼。

它包含minValue但不包括maxValue 因此,如果要生成1到2000000之間的數字,請使用:

r.Next(1,2000001)

我相信你的問題是依賴於實現的。

在一個范圍內生成隨機整數的天真方法是生成一個隨機的32位字,然后在整個范圍內對其進行標准化。

您正常化的范圍越大,每個單個值的概率波動越大。

在您的情況下,您將超過200萬輸出的43億輸入正常化。 這意味着您范圍內每個數字的概率在2000年(或0.05%)差異最多約為1。 如果你的概率略有不同,那就繼續吧。

  • 上限包括?

不,上限是獨占的,因此您必須使用2000001來包含2000000。

  • 有什么建議嗎?

讓我冒昧地建議不要使用一段while(true) / break 只需在if語句中輸入if的條件:

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

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

我知道這是挑剔,但這一個建議...... :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM