2014-02-28 111 views
2

我想寫一個彩票繪製程序,它需要從1-2000000範圍內隨機選擇20000個數字。代碼如下:Random.Next()的概率

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全部相同的數字可能200萬?
  2. 是否在r.Next()中包含了上限2000000?
  3. 有什麼建議嗎?
+1

@Liath因爲他想20000張的隨機數,不一個20000到2000000之間的隨機整數? – Phylogenesis

+2

「Random.Next(int)」的文檔在上限方面告訴你什麼? (它沒有提及分配 - 這在理論上是統一的,但可能不像它可能*一樣統一。) –

+0

你想要不同的數字嗎?還是重複的號碼可以接受? – CodesInChaos

回答

6

.NET Random類在生成隨機數方面做得相當不錯。但請注意,如果您使用相同的號碼播種,則每次都會得到相同的「隨機」數字。如果你不想要這種行爲,不要提供種子。

如果你使用的是更多的隨機數生成器,而不是內置的.NET生成器,那麼看看random.org。它是獲得真隨機數的最佳網站之一 - 我相信這是一個API。以下是他們網站的報價:

RANDOM.ORG爲互聯網上的任何人提供真正的隨機數字。隨機性來自大氣噪聲,其對於許多目的比計算機程序中通常使用的僞隨機數算法更好的 。人們使用RANDOM.ORG來持有圖紙, 抽獎和抽獎,以驅動遊戲和賭博網站, 科學應用和藝術和音樂。該服務自1998年以來一直存在 ,由愛爾蘭都柏林三一學院科學與統計學院計算機學院的Mads Haahr博士建造。今天, RANDOM.ORG由隨機性和誠信服務有限公司

最後Random.Next()操作是exlusive所以你提供的上限值將永遠不會被調用。如果你想要2000000的話,你可能需要適當地調整你的代碼。

+1

不,這不是真的,沒有真正的隨機數,很多隨機系統都是基於系統時間戳等等。電腦不能生成任何隨機的東西!你可以計算任何東西。確定某些方法似乎更加隨機或難以重新計算,但是任何系統都需要一個初始值,之後您可以計算輸出 – CodeFanatic

+0

@FelixLahmer,您認爲哪一點具體出錯?我同意沒有真正的隨機性,但是我推薦的網站使用的天氣肯定是最好的機制之一? – Liath

+2

@FelixLahmer:你讀過Liath鏈接的網站嗎?請注意,有些硬件模塊可用放射性衰變等。據我所知,放射性衰變仍被認爲是隨機的 - 或者至少是人類無法預測的。僅僅因爲*很多*系統使用時間戳並不意味着這就是所有可用的。 –

0

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

在一個範圍內生成一個隨機整數的初始方法是生成一個隨機的32位字,然後在整個範圍內對其進行標準化。

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

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

+0

另外,請記住,您的6位數種子意味着您在整個系統中只有19到20位熵。 – Phylogenesis

+0

爲什麼投入是43億。你如何得到這個價值? –

+0

32位整數給出2^32個不同的值(約43億)。 – Phylogenesis

2

它包括minValue但不包括maxValue。因此,如果你想生成號碼從1 2000000使用:

r.Next(1,2000001) 
0
  • UPPERBOUND包括在內?

不,上界爲獨家所以你必須使用2000001至2000000包含

  • 什麼建議嗎?

請允許我冒昧地建議不要使用while(true)/break。簡單地說的情況,如果你同時聲明:

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

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

我知道這是吹毛求疵,但它建議... :)

+0

'for(var i = 0; i <20000; i ++){...}'有什麼問題? – Phylogenesis

+0

什麼都沒有,爲什麼會有?我只是建議*不*使用'while(true)/ break'。如果他想使用for循環,那也沒關係。 – Abbas

+0

對不起,這只是原來的問題,你的修復似乎避免使用明顯的'for'循環。 – Phylogenesis