随机字生成器具有相同的字母出现概率

时间:2017-05-01 16:49:10

标签: c# random probability

所以我在c#中创建了一个非常简单的单词生成器程序,效果相对较好。我的问题是如何生成具有相同的字母出现概率的单词,例如。 aaaa,aabb或abab

我的代码:

listView1.Items.Clear();

        int num_letters = 4;
        int num_words = 20;

      char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

       Random rand = new Random();

         for (int i = 1; i <= num_words; i++)
        {
           string word = "";
            for (int j = 1; j <= num_letters; j++)
            {
                int letter_num = rand.Next(0, letters.Length - 1);

               word += letters[letter_num];
            }

             listView1.Items.Add(word);

1 个答案:

答案 0 :(得分:4)

这个问题非常令人困惑。

如果您要问的是如何生成每个字母不同的四个字母的单词,您可以这样做:

string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string word = new string(letters.OrderBy(x=>random.NextDouble()).Take(4).ToArray());

不是最有效的方法,但写作快捷方便。

更新:我终于找到了原始海报所要求的东西。他们想要具有以下属性之一的属性的四个字符的字符串:

  • 四个字符相同
  • 两个不同的字符每次出现两次
  • 所有四个字符都不同

这很容易。两种可能的算法:

  • 从以下可能性中随机选择:“0000”,“0011”,“0101”,“0110”,“1001”,“1010”,“1100”,“0123”,无论您分发什么觉得合适。然后通过上面给出的算法选择四个随机的不同字母。然后搜索并替换模式字符串,以便用随机字符串中的第一个字符替换零,一个用第二个字符替换,依此类推。

  • 请拒绝:

string word = null;
while(true) 
{
  word = GenerateRandomWord(); 
  if (AllFourAreDifferent(word)) return word;
  if (AllFourAreTheSame(word)) return word;
  if (TwoAndTwo(word)) return word;
}

现在你所要做的就是实现那四个辅助方法,每个方法都很简单。

使这个问题如此混乱的原因是原始海报似乎不明白百分比和概率不是一回事。问题应该是“如何生成随机字符串,该字符串具有字符串的每个不同字符与字符串中的其他字符消耗字符串相同部分的属性?”这非常与使用相同概率的每个字符不同。