代码之家  ›  专栏  ›  技术社区  ›  Stefan N

如何生成N个字符的所有字母数字组合[重复]

  •  -3
  • Stefan N  · 技术社区  · 1 年前

    为了编写一个通用解码器作为一个个人项目,我试图生成任何给定长度的所有字母数字组合。

    我有一些类似的功能,但我非常怀疑它是否会产生所有这些功能,因为它似乎偏向于字母组合。

    代码:

        {
            string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            List<string> combinations = new List<string>();
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
               
                var random = new Random();
    
    
    
                for (int x = 0; x <= 999; x++)
                {
    
                    combinations.Add(chars[random.Next(chars.Length)].ToString());
                    for (int i = 0; i <= 8; i++)
                    {
                        combinations[x]+= chars[random.Next(chars.Length)].ToString();
    
    
    
                    }
    
    
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                for (int x=0; x<99; x++)
                {
                    Console.WriteLine(combinations[x]);
    
                }
            }
        }
    
    

    有人能向我解释一下如何生成任何给定长度的所有它们吗? 我正在考虑嵌套for循环,带有条件语句。 因此,如果组合[x]<给定长度,则执行for循环。 这行得通吗?或者你知道更好的方法吗?

    问候

    1 回复  |  直到 1 年前
        1
  •  0
  •   André Luís de Andrade    1 年前

    好吧,这是一个有点艰巨的挑战。看一眼,你的方法似乎有效。也就是说,如果你按下按钮1的次数足够多(也就是说比任何人都有耐心的次数都多),它就会产生所有可能的组合。

    它之所以倾向于字母,是因为它确实如此。有26个字母,只有10个数字,这使得任何给定的字符成为字母的可能性都是数字的2.6倍。

    我之所以说这是一个艰巨的挑战,是因为组合的数量随着绳子的长度呈指数级增长。

    共有36个字符

    • 长度为1的字符串有36^1=36种可能的组合
    • 长度为2的字符串有36^2=1296个可能的组合
    • 长度为10时,这是3.656.158.440.062.976种可能的组合

    您不可能希望为任何字符串长度生成每种可能的组合,因为只有50个长度时,它将是(假设每个字符1个字节)1个字节*50*36^50。这是一个有77位数字的数字,它将占用多少字节。去掉9个数字,你就得到了68个数字的千兆字节,我想这比你电脑的内存能处理的略多