2014-01-10 68 views
2

好吧,我一直在這一整天工作..我卡住了。我是否錯過了一些不會讓我強制使用隨機函數來確保它在循環列表之前再次通過列表的問題?問題是它有時會連續顯示相同的項目。所以我的目標是獲得一個「itunes」功能,它可以確保什麼時候洗牌,它不會擊中已經「顯示」的項目。隨機文本列表問題

我當前的代碼:

Dim rng As New System.Random() 
    Dim RAND(16) As String 
    RAND(0) = "A" 
    RAND(1) = "B" 
    RAND(2) = "C" 
    RAND(3) = "D" 
    RAND(4) = "E" 
    RAND(5) = "F" 
    RAND(6) = "G" 
    RAND(7) = "H" 
    RAND(8) = "I" 
    RAND(9) = "J" 
    RAND(10) = "K" 
    RAND(11) = "L" 
    RAND(12) = "M" 
    RAND(13) = "N" 
    RAND(14) = "O" 
    RAND(15) = "P" 
    RAND(16) = "Q" 
    If TextBox1.Text = 'Current Text 
    Then 
    TextBox1.Text = ("""" & RAND(rng.Next(RAND.Count())) & """") 
    End If 

回答

1

嘗試不同的方法。讓你的RAND像列表一樣工作。當信件被抓取時,實際上將其從列表中移除。這涉及到刪除它,填補新的空白空間,並調整計數。

3

隨機數字不這樣工作。一個真正的隨機序列在其中有重複的數字。 Random類有時會返回重複的數字。

爲了滿足您的要求,您必須跟蹤已經使用的內容,而不是再次使用這些內容。或者更好,不是從列表中刪除項目,只是隨機選擇任意兩個項目並交換它們。這樣做一定次數 - 比如100次。然後通過調用String.Join("", RAND)來構建一個字符串。像這樣(未經測試,但這應該給你正確的想法):

Dim rng As New System.Random() 
Dim RAND(16) As String 

' Initialize your array -- this is shorter than your code, 
' but does the same thing 
For i As Integer = 0 to RAND.Length-1 
    RAND(i) = Chr(i+65) 
Next 

' Pick two random characters and swap them. Do this 100 times. 
For i As Integer = 1 to 100 
    Dim first As Integer = rng.Next(RAND.Length) 
    Dim second As Integer = rng.Next(RAND.Length) 
    Dim temp = RAND(first) 
    RAND(first) = RAND(second) 
    RAND(second) = temp 
Next 

TextBox1.Text = String.Join("", RAND) 
0

而不是數組,你可以使用字符串列表。在使用列表中的項目之後 - 將其刪除。這樣保證不會再被使用。例如: -

Dim iRand As Integer  
Dim RAND As New List(of String) 

RAND.Add("A") 
RAND.Add("B") 
RAND.Add("C") 
RAND.Add("D") 
RAND.Add("E") 
RAND.Add("F") 
RAND.Add("G") 
RAND.Add("H") 
RAND.Add("I") 
RAND.Add("J") 
RAND.Add("K") 
RAND.Add("L") 
RAND.Add("M") 
RAND.Add("N") 
RAND.Add("O") 
RAND.Add("P") 
RAND.Add("Q") 

Randomize 

Do While RAND.Count > 0 
    iRand = Math.Floor(Rnd(1)*RAND.Count) 
    Console.writeline(RAND(iRand)) 
    RAND.RemoveAt(iRand) 
Loop 

DEMO:http://dotnetfiddle.net/5SN3Bu

如果您需要再次重用列表 - 它簡單的重新初始化爲原始值後,你發現它是空的,從頭再來刪除項目。

0

假設這是第一個宣佈:

Dim RAND(16) As String 
RAND(0) = "A" 
'[...] 
RAND(16) = "Q" 

這裏是一個快速的方法來打亂你的信(也適用於任何字符串):

Dim oRandom As New System.Random 
Dim asShuffled As String() = RAND.OrderBy(Function() oRandom.Next).ToArray 

也看到這一點: