2015年vb有什么方法我可以用一个单词并且每次以不同的顺序随机化字母的顺序吗?
答案 0 :(得分:2)
有用于生成字母的所有排列的算法。 Knuth算法是较简单的算法之一,并且具有内存效率。但如果您只需要任何排列,那么您可以进行随机播放。一个简单但有效的改组是在每个位置用随机位置的字母交换字母。我的一本旧教科书将以下称为蒙特卡洛洗牌。
Private Function ShuffleWord(Word As String) As String
Dim rand As New Random
Dim j As Integer
Dim chars() As Char = Word.ToCharArray
For i As Integer = 0 To chars.Length - 1
j = rand.Next(Word.Length)
Dim t As Char = chars(i)
chars(i) = chars(j)
chars(j) = t
Next
Return New String(chars)
End Function
您可以这样称呼它:
TextBox1.Text = ShuffleWord(TextBox1.Text)
这种方法简单直观,但还有其他方法可以进行随机播放:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Pencil-and-paper_method。
答案 1 :(得分:2)
最短的是order by random number,如下所示:
Dim input As String = "Hello, World!"
Dim rnd As New Random
Dim shuffledInput As String = input.OrderBy(Function() rnd.Next).ToArray
'outputs something like: "!ld ,WoloeHlr"
为什么它可以工作的一点解释 - 任何字符串都可以被视为一个字符数组,这意味着您可以在其上应用LINQ,与任何其他IEnumerable(Of T)相同。第二部分是知道你可以从char数组中分配字符串,所以下面的行完全可以正常工作:
Dim charArray As String = {"a"c, "b"c, "c"c} 'contains "abc"
另一种方法 - 字符串构建器会更有效 - 但只是为了显示这个想法 - 通过随机取一个字符从input
创建新字符串:
Private Function randomizeString(ByVal input As String) As String
Dim rtn As String = ""
Dim i As Integer
While input.Length > 0
i = ran.Next(0, input.Length)
rtn &= input.Substring(i, 1)
input = input.Remove(i, 1)
End While
Return rtn
End Function