随机串c#

我想知道随机串

示例字符串

string word; //I want to shuffle it word = "hello" 

我能得到:

 rand == "ohlel" rand == "lleho" etc. 

这个解决方案(以扩展方法的forms)很好:

  public static string Shuffle(this string str) { char[] array = str.ToCharArray(); Random rng = new Random(); int n = array.Length; while (n > 1) { n--; int k = rng.Next(n + 1); var value = array[k]; array[k] = array[n]; array[n] = value; } return new string(array); } 

C#:

 string str = "hello"; // The random number sequence Random num = new Random(); // Create new string from the reordered char array string rand = new string(str.ToCharArray(). OrderBy(s => (num.Next(2) % 2) == 0).ToArray()); 

你正在寻找像Fisher-Yates shuffle这样的东西。 该页面上实际上有一个Python示例:

 import random def shuffle(x): for i in reversed(range(1, len(x))): # pick an element in x[:i+1] with which to exchange x[i] j = random.randrange(i+1) x[i], x[j] = x[j], x[i] 

编辑:由于您的问题都被标记为ironpythonc# ,因此还有一个Java示例很容易转换为C#。

尝试Fisher-Yates Shuffle:

 class Shuffle { static System.Random rnd = new System.Random(); static void Fisher_Yates(int[] array) { int arraysize = array.Length; int random; int temp; for (int i = 0; i < arraysize; i++) { random = i + (int)(rnd.NextDouble() * (arraysize - i)); temp = array[random]; array[random] = array[i]; array[i] = temp; } } public static string StringMixer(string s) { string output = ""; int arraysize = s.Length; int[] randomArray = new int[arraysize]; for (int i = 0; i < arraysize; i++) { randomArray[i] = i; } Fisher_Yates(randomArray); for (int i = 0; i < arraysize; i++) { output += s[randomArray[i]]; } return output; } } class Program { static void Main() { string original = "Hello World!"; string mixedOriginal = Shuffle.StringMixer(original); System.Console.WriteLine("The original string: {0}", original); System.Console.WriteLine("A mix of characters from the original string: {0}", mixedOriginal); System.Console.ReadKey(); } } 

灵感来自tsql’的命令by newid()

 static string shuffle(string input) { var q = from c in input.ToCharArray() orderby Guid.NewGuid() select c; string s = string.Empty; foreach (var r in q) s += r; return s; } 

调整字符串或字符串列表的最佳方法是使用这种方式。 在这里你将得到没有重复:

 class CardsDeck { public static Random r = new Random(); private static List cards = new List{ "♣ King", "♣ Queen", "♣ Jack", " ♣", "♣ 7", "♣ 8", "♣ 9", "♣ 10", "♦ King", "♦ Queen", "♦ Jack", " ♦", "♦ 7", "♦ 8", "♦ 9", "♦ 10", "♥ King", "♥ Queen", "♥ Jack", " ♥", "♥ 7", "♥ 8", "♥ 9", "♥ 10", "♠ King", "♠ Queen", "♠ Jack", " ♠", "♠ 7", "♠ 8", "♠ 9", "♠ 10" }; public string ReceiveCards() { if (cards.Count > 0) { int index = r.Next(cards.Count); var card = cards[index]; cards.RemoveAt(index); return card; } else { return ""; } } } 

你可以试试这样的东西……

 class Program { static bool IsPositionfilled(int Position, List WordPositions) { return WordPositions.Exists(a => a == Position); } public static string shufflestring(string word) { List WordPositions = new List(); Random r = new Random(); string shuffledstring = null; foreach (char c in word) { while (true) { int position = r.Next(word.Length); if (!IsPositionfilled(position, WordPositions)) { shuffledstring += word[position]; WordPositions.Add(position); break; } } } return shuffledstring; } static void Main(string[] args) { string word = "Hel"; Hashtable h = new Hashtable(); for (int count = 0; count < 1000; count++) { Thread.Sleep(1); string shuffledstring = shufflestring(word); if (h.Contains(shuffledstring)) h[shuffledstring] = ((int)h[shuffledstring]) + 1; else h.Add(shuffledstring,1); } Console.WriteLine(word); foreach (DictionaryEntry e in h) { Console.WriteLine(e.Key.ToString() + " , " + e.Value.ToString()); } } } 
 class Program { static void Main(string[] args) { string word = "hello"; string temp = word; string result = string.Empty; Random rand = new Random(); for (int a = 0; a < word.Length; a++) { //multiplied by a number to get a better result, it was less likely for the last index to be picked int temp1 = rand.Next(0, (temp.Length - 1) * 3); result += temp[temp1 % temp.Length]; temp = temp.Remove(temp1 % temp.Length, 1); } Console.WriteLine(result); } } 

我用这个扩展完成了这个:

 public static class Extensions{ public static string Scramble(this string s){ return new string(s.ToCharArray().OrderBy(x=>Guid.NewGuid()).ToArray()); } } 

我尝试了旧学校的方式,这个工作正常。

  static void Main() { string input = "hello"; string output = ""; int ranIndex = 0; List indexes = new List(); char[] split = input.ToCharArray(); Random ran = new Random(); for (int i = 0; i < input.Length; i++) { ranIndex = ran.Next(0, input.Length); if (!indexes.Contains(ranIndex)) { indexes.Add(ranIndex); } else { i--; } } foreach (int value in indexes) { output += split[value]; } Console.WriteLine(output); Console.ReadLine(); } 

费雪耶茨

 static Random rand = new Random(); public static string ShuffleString(string s) { if (string.IsNullOrEmpty(s)) return s; char[] chars = s.ToCharArray(); char c; int j; for(int i = chars.Length - 1; i > 0; i--) { j = rand.Next(i + 1); // Next max is exclusive if (j == i) continue; c = chars[j]; chars[j] = chars[i]; chars[i] = c; } return chars.ToString(); }