2015-11-09 33 views
0

在vb 2015中有什麼方法可以讓我接受一個字,並且每次都以不同順序隨機排列字母順序?每次使用不同的順序在一個字中隨機化字母

+1

請添加一些關於您需要什麼以及您如何接近它的詳細信息。 – Brody

+0

我想要在開始程序之前輸入一個單詞,我不會隨機化這個單詞,所以這些單詞處於不同的位置,因爲我沒有任何想法,所以我沒有去過任何東西。 – Tom

回答

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

+0

對不起,但這個答案有缺陷。參見[Naïveté的危險](http://stackoverflow.com/a/33619422/1070452)。 – Plutonix

+0

@Plutonix你參考了一篇關於洗牌的漂亮文章,我同意上面的算法是有偏見的。有人可能會爭辯說,無偏差算法總是最好的 - 除非有人試圖複製特定的洗牌過程。無論如何,感謝您指出這一點,它會讓我們都成爲更好的程序員。 – JerryM

+0

使用新隨機只是錯誤的 - 它會在循環中產生相同的結果。此外,代碼並不符合您發佈的維基鏈接 - 即一旦交換項目就將其刪除,因此每個項目最多隻能交換一次。答案是使用'rand.Next(0,i + 1)'循環*向後*。這會鎖定/觸發已交換的元素(來自prev迭代的'i'不在'rand.Next()'範圍內)。當試圖複製一個模式時,Random是完全不合適的,Mersenne Twister就是這樣的。 – Plutonix

1

最短的是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)。第二部分是知道你可以從一個字符數組指定字符串,那麼下面這一行工作完全正常:

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 

信用度爲Satal Keto on this forum

+1

很好的答案,我不知道你可以通過rnd.next訂購 – Nefariis

相關問題