【问题标题】:How do I generate a random alphanumeric array that has 3 letter and 6 digits in c#?如何在 c# 中生成一个包含 3 个字母和 6 个数字的随机字母数字数组?
【发布时间】:2016-04-26 16:55:33
【问题描述】:

我正在尝试生成一个由 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();


    }

【问题讨论】:

  • @RionWilliams 我不同意,这次有特定的字母和数字计数,这需要非常不同的技术
  • 公平点。我对此持观望态度,虽然该线程中有很多技术,但我不相信任何涵盖特定数量的字符。我撤回了接近投票。
  • 结果中没有提到字符和数字是否可以重复。你想要组合还是排列?
  • 这对我来说就像家庭作业。

标签: c# arrays random


【解决方案1】:

你已经接近了。但这里的问题是你从“半排序”数组中随机选择,而此时真正需要的是选择随机排列。一种方法是使用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);

【讨论】:

    【解决方案2】:

    Harold 的回答要简洁得多,但对于整个“在编程中做同样事情的 100 种方法”概念,这里有另一种方法。 [编辑:Doh,我颠倒了数字和字母的数量。这是一个修复:]

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

    【讨论】:

    • 再次清理,因为我没有意识到我留下了测试的残留物。
    • 这不是很明显,但是这种洗牌方式偏向于将项目保留在原始顺序中。这不是一个很大的影响,因为 random.Next 的范围非常大。但是假装你有random.Next(2) 并且你正在洗牌一个包含 2 个项目的列表。 OrderBy 是稳定的,因此 3/4 的结果(对于随机数)使其给出原始顺序。对于Next(3),它是 6/9,依此类推,直到 ((2^31+1) 选择 2) / ((2^31)^2) 大约为 0.50000000023。长于 2 的列表显然有类似的问题,但思想实验更难。
    • 伟大的洞察力和一些我没有考虑过的东西,但这是一个非常有效的观点。感谢您的反馈!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2011-01-29
    • 2015-07-29
    • 2011-02-17
    • 2015-11-09
    相关资源
    最近更新 更多