C# 字母出现概率相等的随机字生成器

C# 字母出现概率相等的随机字生成器,c#,random,probability,C#,Random,Probability,因此,我用c语言编写了一个相当简单的单词生成器程序,效果相对较好。我的问题是如何生成字母出现概率相等的单词,例如aaaa、aabb或abab 我的代码: listView1.Items.Clear(); int num_letters = 4; int num_words = 20; char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); Random rand =

因此,我用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);
listView1.Items.Clear();
int num_字母=4;
int num_words=20;
char[]letters=“abcdefghijklmnopqrstuvxyz.ToCharArray();
Random rand=新的Random();

对于(inti=1;i,这个问题非常令人困惑

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

string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string word = new string(letters.OrderBy(x=>random.NextDouble()).Take(4).ToArray());
这不是最有效的方法,但是写起来又快又容易

更新:我终于弄明白了原始海报的要求。他们想要四个字符的字符串,这些字符串具有以下属性之一为真:

  • 这四个字符是相同的
  • 两个不同的字符各出现两次
  • 这四个角色都不同
这很简单。两种可能的算法:

  • 从以下可能性中随机选择:“0000”、“0011”、“0101”、“0110”、“1001”、“1010”、“1100”、“0123”,使用您认为合适的任何分布。然后根据我上面给出的算法选择四个随机的不同字母。然后搜索并替换模式字符串,以便用随机字符串中的第一个字符替换零,用第二个字符替换一个,依此类推

  • 是否拒绝:


现在您所要做的就是实现这四个helper方法,每个方法都很简单



让这个问题如此困惑的是,原来的海报似乎不明白百分比和概率不是一回事。这个问题应该是“如何生成具有以下属性的随机字符串:字符串中的每个不同字符与字符串中的每个其他字符使用相同的字符串分数?"这与以相同概率出现的每个字符都非常不同。

您似乎已经这样做了。我不明白您的要求;您已经编写了代码来实现您的要求。此外,我注意到
tocharray
是不必要的。没有它,您的程序也可以正常工作;
字母可以是
string
。在你的程序中,它们是这样做的!你已经得到了你想要的。单词中的每个字母都有1/26的机会成为字母表中的任何字母。那么,你所写的内容会让你相信它不是在做你想要的事情吗?当然是这样。有456976个可能的单词,HJYY就是其中之一,它将在一年内生成一次平均来说是456976次尝试。就像在456976中会生成一次AAAA,在456976中会生成一次OOP,在456976中会生成一次GOAT,以此类推。这在我的代码中应该是什么样子?这是否意味着
x=>random.NextDouble()的结果
是为
orderby
缓存的?@user5734658:这里有很多提示可以用来构造一个工作程序。@MennovandenHeuvel:是的!
这与每个字符以相同的概率出现是非常不同的。
在我看来,从语言上讲,它并没有你想象的那么不同。概率是一个描述对预期频率的预测。说你有50%的机会获得磁头,实际上是说在大型数据集中,磁头往往会出现大约一半的时间。然而,OP没有看到预期频率(概率)和结果频率(实际掷硬币并记录结果)之间的差异
string word = null;
while(true) 
{
  word = GenerateRandomWord(); 
  if (AllFourAreDifferent(word)) return word;
  if (AllFourAreTheSame(word)) return word;
  if (TwoAndTwo(word)) return word;
}