C# 如何创建具有特定数量数字的随机字符串?

C# 如何创建具有特定数量数字的随机字符串?,c#,random,C#,Random,我想创建一个函数,它允许我生成一个具有特定条件的随机字符串,比如最大2位数,等等 到目前为止,我已经找到了这个,但我不知道如何使其最大为两位数: public static string Generate(int size) { const string chars = "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; var random = new

我想创建一个函数,它允许我生成一个具有特定条件的随机字符串,比如最大2位数,等等

到目前为止,我已经找到了这个,但我不知道如何使其最大为两位数:

public static string Generate(int size)
        {
            const string chars = "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            var random = new Random();
            return new string(Enumerable.Repeat(chars, size).Select(s => s[random.Next(s.Length)]).ToArray());
        }

跟踪数字的数量,如果已经有两个,请从非数字字符字符串中选择:

    string GetRandomString(int length)
    {
        var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        var nonDigitChars = chars.Where(x => !char.IsDigit(x)).ToArray();

        var random = new Random();
        int numberOfDigits = 0;

        var randomChars = new char[length];
        for (int i = 0; i < randomChars.Length; i++)
        {
            char c;
            if (numberOfDigits == 2)
            {
                //select from nonDigitChars
                c = nonDigitChars[random.Next(nonDigitChars.Length)];
            }
            else
            {
                c = chars[random.Next(chars.Length)];

                if (char.IsDigit(c))
                {
                    numberOfDigits++;
                }
            }

            randomChars[i] = c;
        }

        return new string(randomChars);
    }
string GetRandomString(int-length)
{
var chars=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789”;
var nonDigitChars=chars.Where(x=>!char.IsDigit(x)).ToArray();
var random=新的random();
int numberOfDigits=0;
var randomChars=新字符[长度];
for(int i=0;i
跟踪数字的数量,如果已经有两个,请从非数字字符字符串中选择:

    string GetRandomString(int length)
    {
        var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        var nonDigitChars = chars.Where(x => !char.IsDigit(x)).ToArray();

        var random = new Random();
        int numberOfDigits = 0;

        var randomChars = new char[length];
        for (int i = 0; i < randomChars.Length; i++)
        {
            char c;
            if (numberOfDigits == 2)
            {
                //select from nonDigitChars
                c = nonDigitChars[random.Next(nonDigitChars.Length)];
            }
            else
            {
                c = chars[random.Next(chars.Length)];

                if (char.IsDigit(c))
                {
                    numberOfDigits++;
                }
            }

            randomChars[i] = c;
        }

        return new string(randomChars);
    }
string GetRandomString(int-length)
{
var chars=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789”;
var nonDigitChars=chars.Where(x=>!char.IsDigit(x)).ToArray();
var random=新的random();
int numberOfDigits=0;
var randomChars=新字符[长度];
for(int i=0;i
您可以对“数字”、“小写”和“大写”类别进行硬编码,并跟踪每个类别中已添加到生成字符串的数量:

public static string Generate(int size, int? maxDigits = null, int? maxLowerCase = null, int? maxUpperCase= null)
{
    if (maxDigits.HasValue && maxLowerCase.HasValue && maxUpperCase.HasValue && maxDigits + maxLowerCase + maxUpperCase< size)
    {
        throw new ArgumentOutOfRangeException($"Can't generate a string of length {size} with the given limits");
    }

    const string chars = "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    var passwordBuilder = new StringBuilder();

    var random = new Random();

    int digitCount = 0, lowerCaseCount = 0, upperCaseCount = 0;

    while (passwordBuilder.Length < size)
    {
        var nextCharacter = chars[random.Next(chars.Length)];

        if (char.IsDigit(nextCharacter) && (!maxDigits.HasValue || digitCount < maxDigits))
        {
            passwordBuilder.Append(nextCharacter);
            digitCount++;
        }
        if (char.IsLower(nextCharacter) && (!maxLowerCase.HasValue || lowerCaseCount < maxLowerCase))
        {
            passwordBuilder.Append(nextCharacter);
            lowerCaseCount++;
        }
        if (char.IsUpper(nextCharacter) && (!maxUpperCase.HasValue || upperCaseCount < maxUpperCase))
        {
            passwordBuilder.Append(nextCharacter);
            upperCaseCount++;
        }
    }

    return passwordBuilder.ToString();
}

您可以对类别“数字”、“小写”和“大写”进行硬编码,并跟踪每个类别中有多少已添加到生成的字符串中:

public static string Generate(int size, int? maxDigits = null, int? maxLowerCase = null, int? maxUpperCase= null)
{
    if (maxDigits.HasValue && maxLowerCase.HasValue && maxUpperCase.HasValue && maxDigits + maxLowerCase + maxUpperCase< size)
    {
        throw new ArgumentOutOfRangeException($"Can't generate a string of length {size} with the given limits");
    }

    const string chars = "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    var passwordBuilder = new StringBuilder();

    var random = new Random();

    int digitCount = 0, lowerCaseCount = 0, upperCaseCount = 0;

    while (passwordBuilder.Length < size)
    {
        var nextCharacter = chars[random.Next(chars.Length)];

        if (char.IsDigit(nextCharacter) && (!maxDigits.HasValue || digitCount < maxDigits))
        {
            passwordBuilder.Append(nextCharacter);
            digitCount++;
        }
        if (char.IsLower(nextCharacter) && (!maxLowerCase.HasValue || lowerCaseCount < maxLowerCase))
        {
            passwordBuilder.Append(nextCharacter);
            lowerCaseCount++;
        }
        if (char.IsUpper(nextCharacter) && (!maxUpperCase.HasValue || upperCaseCount < maxUpperCase))
        {
            passwordBuilder.Append(nextCharacter);
            upperCaseCount++;
        }
    }

    return passwordBuilder.ToString();
}

像这样的怎么样?一旦达到最大位数,就会更改源“字符”字符串

private静态字符串生成器domstring(int-size,int-maxDigits=2)
{
char[]fullChars=“abcdefghijklmnopqrstuvwxzabcdfghijklmnopqrstuvwxyz012456789”。ToCharArray();
char[]alphaOnly=“abcdefghijklmnopqrstuvxzabcdefghijklmnopqrstuvxyz”。ToCharArray();
字符[]当前=完整字符;
var random=新的random();
var buffer=新的StringBuilder(大小);
var digitCount=0;
对于(变量i=0;i=maxDigits)
{
电流=仅字母;
}
}
返回buffer.ToString();
}
我使用如下代码对其进行了测试:

 for (var i = 0; i < 30; ++i)
 {
     var result = GenerateRandomString(50, 3);
     var digitCount = result.ToCharArray().Where(char.IsDigit).Count();
     Debug.Assert(digitCount <= 3);
 }
for(变量i=0;i<30;++i)
{
var结果=GeneratorDomainString(50,3);
var digitCount=result.ToCharArray().Where(char.IsDigit.Count();

Assert(digitCount类似的东西怎么样?一旦达到最大位数,它就会更改源“字符”字符串

private静态字符串生成器domstring(int-size,int-maxDigits=2)
{
char[]fullChars=“abcdefghijklmnopqrstuvwxzabcdfghijklmnopqrstuvwxyz012456789”。ToCharArray();
char[]alphaOnly=“abcdefghijklmnopqrstuvxzabcdefghijklmnopqrstuvxyz”。ToCharArray();
字符[]当前=完整字符;
var random=新的random();
var buffer=新的StringBuilder(大小);
var digitCount=0;
对于(变量i=0;i=maxDigits)
{
电流=仅字母;
}
}
返回buffer.ToString();
}
我使用如下代码对其进行了测试:

 for (var i = 0; i < 30; ++i)
 {
     var result = GenerateRandomString(50, 3);
     var digitCount = result.ToCharArray().Where(char.IsDigit).Count();
     Debug.Assert(digitCount <= 3);
 }
for(变量i=0;i<30;++i)
{
var结果=GeneratorDomainString(50,3);
var digitCount=result.ToCharArray().Where(char.IsDigit.Count();

Debug.Assert(digitCount)将大小更改为硬编码2似乎每个人都缺少问题中的“digits”一词。OP希望确保返回2个数字。
size
似乎是字符串的整个大小,而不是位数。您需要编写一些代码来完成此操作。例如,有两个可能的输入数组(您的
chars
字符串),一个带数字,一个不带数字。在生成字符串时,如果超过两个数字,请切换到非数字字符串。这将减少结果字符串的熵,尽管“某些条件如”-您最好列出所有条件,并展示您尝试过的内容。如果这是关于数字,则更改
可枚举。重复
到一个循环,该循环将字符附加到字符串,只要满足您的条件。您可以创建条件作为参数,如
int?maxDigits=null,int?maxLowerCase=null,int?maxUppercase=null
并从验证这些参数开始。这是否回答了您的问题?将大小更改为硬编码2似乎每个人都缺少问题中的“数字”一词。OP希望确保返回2个数字。
大小
似乎与整个大小有关