在C#中随机化字符串

问题描述 投票:3回答:2

我试图随机化字符串元素,但我的代码重复字符串。有人能解释我的代码有什么问题吗?

string[] words = Console.ReadLine().Split();
//input = "Welcome and have fun learning programming"

Random number = new Random();

for (int i = 0; i < words.Length; i++)
{
    int currRandomNumber = number.Next(0, words.Length);
    words[i] = words[currRandomNumber];
}

Console.WriteLine(string.Join(' ', words));      
//output = "have learning learning learning learning programming"

我正在面对重复的问题,而且它不是随机的?如果您不明白我的意思,请参阅我在代码中添加的注释。任何帮助将不胜感激!

c# arrays random
2个回答
5
投票

这些话是重复的,因为你这样做:

words[i] = words[currRandomNumber];

该行意味着“将索引currRandomNumber中的单词复制到索引i”。只要icurrRandomNumber不同,您就可以保证有重复的单词。

你打算做什么可能是交换currRandomNumberi的话:

var temp = words[i];
words[i] = words[currRandomNumber];
words[currRandomNumber] = temp;
// in C# 7, you could swap two values very easily by:
// (words[currRandomNumber], words[i]) = (words[i], words[currRandomNumber]);

或者,您可以使用Fisher Yates shuffling algorithm,这可以确保每个排列都有相同的发生机会:

static void Shuffle<T>(T[] array)
{
    int n = array.Length;
    for (int i = 0; i < n; i++)
    {
        int r = i + _random.Next(n - i);
        T t = array[r];
        array[r] = array[i];
        array[i] = t;
    }
}

// Shuffle(words);

2
投票

或者,您可以按随机顺序将每个单词放入新列表中:

    List<string> words = Console.ReadLine().Split().ToList();
    //input = "Welcome and have fun learning programming"

    Random number = new Random();
    var newwords = new List<string> ();

    while (words.Count > 0)
    {
        int currRandomNumber = number.Next(0, words.Count);
        newwords.Add( words[currRandomNumber]);
        words.RemoveAt(currRandomNumber);
    }

    Console.WriteLine(string.Join(' ', newwords));    
© www.soinside.com 2019 - 2024. All rights reserved.