Fisher-Yates在单个字符串上进行洗牌而不是使用相等长度的排列?

现在我正在开发一套文字游戏作为教我自己的手段(并重新创建一些我最喜欢的文字游戏!)在“实际”学习的编程朋友的帮助下,我们在其中一个中实现了一个很好的排列方法我的课程。 它正在查找3个字母以上的所有排列,并将它们与我所包含的字符串列表进行比较,其中包含基本上是Scrabble锦标赛单词列表。

这就是背景,这是我当前的问题:我现在已经拥有了所有的排列,并将它们与现有单词进行了比较,并创建了一个新的List,其中包含给定字符串中所有可能的单词组合。 但是,当我向用户提供此字符串时,我需要对其进行加扰。 我找到了Fisher-Yates shuffle的一些C#实现,但我没有成功地使它们接受单个字符串(编辑:Fisher-Yates问题用char []数组解决)。 然后我有了一个黑客的想法 – 为什么不使用一个相同长度的排列但是!=原始单词。

不幸的是,每当我的条件语句向后返回单词时。 最终用户没有那么难以弄明白:)这是我的加扰代码:

// permWords is a Dictionary<int, List> String strScrambled= ""; foreach (List listWords in permWords.Values) { foreach (string word in listWords) { if (word.Length == strWord.Length && word != strWord) { strScrambled = word; } } } 

我已经尝试过strScrambled = word + 1假设第一个排列不strScrambled = word + 1原始的单词是向后的。 但是,我不认为在这种情况下真的“有效”; 特别是考虑到它仍然返回相同的倒退词。

对于如何使用char数组修复Fisher-Yates的问题,我得到了一个非常有用的答案,但我仍然很想知道如何最好地使用像我发布的那样,只找到一个确保答案不仅仅是拼写单词的方法。 我对这种方法很感兴趣,因为排列列表已经存在; 我想把它作为我的解决方案。

我想你已经有了一个可以进行改组的方法:

 void FisherYatesShuffle(char[] elements) { int N = elements.Count; for(int i = 0; i 

所有你需要做的就是将你的字符串转换为CharArray,然后将结果转换回字符串:

 string shuffle(string input) { var arr = input.ToCharArray(); FisherYatesShuffle(arr); return new String(arr); } 

看看这对你有用吗……

 string str = "hello"; // The random number sequence Random num = new Random(); string rand = str; while (rand == str) rand = new string(str.OrderBy(s => (num.Next())).ToArray()); 

如果你想确保洗牌后的值不是完全相反的话,你可以将while条件改为……

 while (rand == str || rand == str.Reverse())