随机文本列表问题

时间:2014-01-10 20:01:39

标签: vb.net

好的,我一整天都在努力......我被困了。我只是遗漏了一些不允许我强制随机函数确保它再次循环列表之前通过列表的东西吗?问题是它有时连续显示相同的项目。因此,我的目标是获得一个“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

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

尝试不同的方法。让你的兰德像列表一样工作。抓住一封信,实际上将其从列表中删除。这包括删除它,填充新的空白空间,以及调整计数。

答案 2 :(得分: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

如果您需要再次重复使用该列表 - 在检测到它为空并开始重新删除项目后,将其重新初始化为原始值。

答案 3 :(得分: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

另见:

相关问题