【问题标题】:Randomize string in C#在 C# 中随机化字符串
【发布时间】:2019-08-07 20:19:18
【问题描述】:

我正在尝试随机化字符串元素,但我的代码是重复字符串。有人可以解释我的代码有什么问题吗?

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"

我遇到了单词重复的问题,而且不是随机的?如果您不明白我的意思,请参阅我在代码中添加的 cmets。任何帮助将不胜感激!

【问题讨论】:

  • Randomize a List<T>的可能重复
  • @Pac0,抱歉我没看到那个帖子。 :)
  • Random 在样本量较小时会出现问题。
  • @Nikol 没问题!
  • @SarveshMishra:这里的问题不在于Random——而是它的使用方式。

标签: c# arrays random


【解决方案1】:

因为你正在这样做,所以这些词在重复:

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));    
    

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 1970-01-01
      • 2013-10-14
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多