2013-06-26 88 views
0

我一直有這部分在我的代碼的問題:隨機序列問題

Random rand = new Random(); 
string[] MyRandomArray = choices.OrderBy(x => rnd.Next()).ToArray(); 
string[] newArray = new string[4]; 

int num = 0; 

for (num = 0; num < 3; num++) 
{ 
    newArray[num] = MyRandomArray[num]; 
} 

newArray[num] = "1"; 

string[] finalArray = newArray.OrderBy(x => rnd.Next()).ToArray(); 
this.radioButton1.Text = newArray[0]; 
this.radioButton2.Text = newArray[1]; 
this.radioButton3.Text = newArray[2]; 
this.radioButton4.Text = newArray[3]; 

我試圖做的是讓陣列的不同地方newArray在單選按鈕1,2,3和4.但是,我在我分配的最後一個數組中遇到問題。它不包含在shuffle中,所以我得到的唯一隨機值是單選按鈕1,2和3.每當我嘗試重新啓動程序時,單選按鈕4都保持不變。

+1

改變你的'for'環路'的(NUM = 0; NUM <= 3; NUM ++) '=) –

+0

感謝您的快速響應和瑞,我不能這樣做,因爲我想分配newArray [num] =「1」 –

+1

但是,在這一點上,'num'是2。你從來沒有給'newArray [3]'設置一個值! –

回答

0

上隨機取樣和潛在的問題的詞:

Random Class在其生成隨機數的唯一的序列見文檔的備註部分能力一些侷限性:

  1. 具體地說,因爲Random的默認構造函數使用基於系統時鐘的種子初始化 ,所以當重複初始化Random實例時,可以獲得重複的 序列 非常很快。前面引用的備註部分包括 代碼,演示此問題。
  2. 調用Random類實例的方法不保證 是線程安全的。因此,使用Random的單個實例來避免播種問題可能會遇到其他線程問題。

使用Guid.NewGuid Method品嚐一組會給出更好的結果用於生產,因爲它不會重複序列,如果所謂的快速連續隨機排序。但是,它也確實會帶來一些注意事項:

  1. 雖然它在卡方檢驗做好隨機選擇, 它不適合用於加密的目的,也不是直接 替代一個實際的隨機數發生器。
  2. 只要NewGuid生成的GUID是版本4的GUID,則 GUID確實包含隨機內容;不過,這可能會在未來改變 。微軟還沒有做出任何聲明,保證GUID將包含隨機內容,只有它們將是 獨一無二,碰撞概率極低。

下面是使用NewGuid什麼樣子:

string[] myRandomArray = choices.OrderBy(x => Guid.NewGuid()).Take(3).ToArray(); 

使用RNGCryptoServiceProvider Class是生產可靠的隨機抽樣的最佳解決方案。它既是線程安全的,又不受隨機類所具有的種子問題的影響。但是,它確實需要更多的代碼才能實現。

// TODO: Add code to demonstrate using RNGCryptoServiceProvider 

,因爲你已經在使用LINQ您可以使用需要,而不是一個循環:

// Get 3 random choices in a List. 
List<string> myChoices = choices.OrderBy(x => Guid.NewGuid()).Take(3).ToList(); 

// Add the correct answer. 
myChoices.Add(theAnswer); 

// Randomize the resulting set of 4 choices into an Array. 
string[] myRandomizedChoices = myChoices.OrderBy(x => Guid.NewGuid()).ToArray(); 

this.radioButton1.Text = myRandomizedChoices[0]; 
this.radioButton2.Text = myRandomizedChoices[1]; 
this.radioButton3.Text = myRandomizedChoices[2]; 
this.radioButton4.Text = myRandomizedChoices[3]; 
+0

我看,所以這段代碼會從數組中選擇4個?我可以將此分配給另一個數組,因爲我只想要3和第四個元素將是一個分配字符串 –

+0

感謝您的幫助,似乎我解決了我的問題,如果其他和隨機數 –

+1

@MaryGraceIsananViaje [Guids不是隨機的] (http://blogs.msdn.com/b/ericlippert/archive/2012/04/30/guid-guide-part-two.aspx),不應該用作隨機數字生成器。這段代碼本質上是壞的,不應該被使用,因爲它不能被依賴來工作,即使它可能在某些情況下工作。 – Servy