如何在C#中生成一个包含3个字母和6个数字的随机字母数字数组?

4
我正在尝试生成一个由3个字母和6个数字组成的随机字母数字数组。整个数组必须是随机的。我能想到的唯一方法是生成2个单独的随机数组,然后合并它们并将合并后的数组随机化。任何帮助都将不胜感激。我特别需要确保存储了正确数量的变量类型的帮助。这是我的半工作代码:
 static void Main(string[] args)
    {
        var alphabetic = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        var numeric = "0123456789";
        var stringChars = new char[9];
        var random = new Random();


        for (int i = 0; i < 3; i++)
        {
            stringChars[i] = alphabetic[random.Next(alphabetic.Length)];
        }
        for(int i = 3; i< stringChars.Length; i++)
        {
            stringChars[i] = numeric[random.Next(numeric.Length)];
        }


        var ranChars = new char[9];
        var semisorted = new String(stringChars);

        for (int i=0; i< ranChars.Length; i++)
        {
            ranChars[i] = semisorted[random.Next(semisorted.Length)];
        }


        var final = new string(ranChars);

        Console.WriteLine("{0}", final);
        Console.ReadLine();


    }

1
可能是如何在C#中生成随机字母数字字符串?的重复问题。 - Rion Williams
2
@RionWilliams 我不同意,这次有特定的字母和数字计数,需要非常不同的技术。 - harold
很好的观点。我对此持中立态度,虽然该线程中有许多技术,但我认为没有涵盖特定字符数量的任何技术。我已经撤回了关闭投票。 - Rion Williams
结果中是否允许字符和数字重复并未提及。您需要组合还是排列? - JerryM
@JerryM 实际上需要一组唯一的字符。那么代码与哈罗德的解决方案有很大不同吗? - pineapple_music495
显示剩余2条评论
2个回答

4
你已经接近答案了。但问题在于,你是从“半排序”数组中随机选择,而实际上此时需要的是选择一个随机排列。一种方法是使用Fisher-Yates shuffle
因此,将其与之前有效的代码结合起来:(未经测试)
for (int i = 0; i < 3; i++)
{
    stringChars[i] = alphabetic[random.Next(alphabetic.Length)];
}
for(int i = 3; i< stringChars.Length; i++)
{
    stringChars[i] = numeric[random.Next(numeric.Length)];
}
int n = stringChars.Length;
while (n > 1) 
{
    int k = random.Next(n--);
    char temp = stringChars[n];
    stringChars[n] = stringChars[k];
    stringChars[k] = temp;
}
string result = new string(stringChars);

0

Harold的答案更干净,但这里是另一种方法来展示编程中“百种方式完成同一件事”的概念。 [编辑:哎呀,我颠倒了数字和字母的数量。这里是一个修正:]

public static void Main(string[] args)
    {
        var random = new Random();
        var finalString = string.Empty;
        var finalArray = new string[9];

        for (var i = 0; i < 3; i++)
        {
            var alphabet = random.Next(0, 26);
            var letter = (char) ('a' + alphabet);
            finalArray[i] = letter.ToString().ToUpper();
        }

        for (var i = 3; i < 9; i++)
        {
            var number = random.Next(0, 9);
            finalArray[i] = number.ToString();
        }

        var shuffleArray = finalArray.OrderBy(x => random.Next()).ToArray();
        for (var i = 0; i < finalArray.Length; i++)
        {
            finalString += shuffleArray[i];
        }
        Console.WriteLine(finalString);
        Console.ReadKey();    
    }

由于我没有意识到我留下了测试的痕迹,所以再次进行了清理。 - Ryan Intravia
1
这种洗牌方式并不明显,但它有偏向于保留原始顺序的倾向。由于 random.Next 的范围相当大,因此影响不大。但是,假设你使用 random.Next(2) 并且要对包含 2 个项目的列表进行洗牌。OrderBy 是稳定的,因此在随机数的 3/4 情况下,它会给出原始顺序。对于 Next(3),它是 6/9 等等,直到 ((2^31+1) choose 2) / ((2^31)^2) 大约为 0.50000000023。显然,长度超过 2 的列表也存在类似的问题,但思想实验更加困难。 - harold
非常有见地,是我没有考虑到的,但是非常有道理。感谢您的反馈! - Ryan Intravia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接