2013-10-14 22 views
3

經過很長時間後,我設法從我的程序中獲得了我在第一個問題中詢問的問題。它將一個隨機數添加到列表中以用作ID號,然後將其導出到Excel。然而,當我在數據文件中使用超過2個數據成員時,我遇到了一個問題:我產生的隨機數字翻倍,導致我的程序崩潰。C#中的隨機數發生器問題#

static Dictionary<string,Backup> getData() 
{ 

    Dictionary<string, Backup> bDict = new Dictionary<string, Backup>(); 
    StreamReader reader = new StreamReader("/data/storedata.txt"); 

    while (!reader.EndOfStream) 
    { 

     string line = reader.ReadLine(); 
     string[] parts = line.Split(' '); 

     string item = parts[0]; 
     string owner = parts[1]; 

     Random rnd = new Random(); 
     int test = rnd.Next(item.Length+10000);//For every 'item' a Random number is generated.(the +10000 is simply to produce a 4-digit number) 

     //Console.WriteLine(test);//Testing 
     Backup BP = new Backup(item, owner,test); 

     bDict.Add(test.ToString(), BP);//Adding to the Dictionary. 

     //Console.WriteLine(string.Format("{0}, {1}, {2}", item, test, owner)); 

    } 
    return bDict; 
}//Read file, Grabed data and stored it in a List. 

後我是什麼/試圖做的是有幾分檢查的,如果兩個數字是相同的一個新號碼作爲替代(或做同樣的事情的其他方式)產生的。我試過如果陳述,但VS不斷問我是否打算與其他東西比較。我在Stackoverflow上看過這裏的東西,但答案並不適合我的代碼。 任何幫助表示讚賞。

FAQ 數據文件將具有向上的500 '的項目' 沒有最小/最大

歡呼聲

+3

我很難相信你找不到的SO另一個例子中,這個問題是如此頻繁它的幾乎符合常見問題。在「提問」區域輸入問題標題可以獲得很多可能的答案。 –

+1

[Revisiting randomness](http://msmvps.com/blogs/jon_skeet/archive/2009/11/04/revisiting-randomness.aspx) – Damith

+0

我猜在這個實例中恐慌設置英寸循環內的語句幾乎沒有很快運行給予所有的io操作(特別是如果未註釋的話)。這會導致隨機數發生一些變化。如果環路比較緊密,那麼對OP來說就會更清楚。 – Bathsheba

回答

2

實例化rnd while循環的外部。然後你會給隨機數的機會表現正確。你在做什麼導致發電機重新初始化;破壞了發生器的統計特性。

但是,對於您的具體問題,我根本不會使用rnd原因是你不想要任何重複的隨機數字。繪製一個隨機數,然後測試它是否已經被繪製效率低下,並且在時間上越來越低效(並且順便也破壞了生成器的統計特性:雖然預期均值將保持正確,但預期的差異將會增加超過1/12,更高的時刻將不正確)。

如果你真的不需要你的序列是特別隨機的(即不關心,平均的預期值是0.5等),那麼你可以開發一個交流,一個整數各個位的功能明確的方式。使用該函數的輸出已連續編號作爲序列。

4

作爲開始,您需要將Random對象初始化移到以外的while循環中。

Random rnd = new Random(); 
while (!reader.EndOfStream).... 

http://msdn.microsoft.com/en-us/library/system.random.aspx

從種子值的隨機數生成開始。如果重複使用相同的種子,則生成相同的一系列數字。以產生不同的序列的一種方法是使種子值時間依賴性,由此產生不同系列的具有隨機的每個新實例。默認情況下,Random類的參數的構造函數使用系統時鐘產生的種子值

這基本上意味着:過快引發它(即某種形式的loop),你可能會得到相同的價值。

5

的隨機數生成我加倍,導致我的程序崩潰。

您必須重複使用相同的隨機實例,因此在循環外部創建它,否則會在同一時間播種相同的數字。

MSDN

隨機數生成從種子值開始。如果重複使用相同的 種子,則會生成相同的一系列數字。

除此之外,你必須檢查數量在Dictionary已經存在:

Random rnd = new Random(); 
while (!reader.EndOfStream) 
// ... 

while(bDict.ContainsKey(test.ToString())) 
    test = rnd.Next(item.Length + 10000); 
+1

這是唯一的答案,也解決了他將有的下一個問題。 – drch

+0

確實和+1一樣,儘管OP會遇到最後一個問題:爲什麼算法在最終停止之前變得越來越慢? – Bathsheba

+0

感謝您的幫助,我應該知道的簡單的事情。這部分將大大幫助。 – Phillip