C# - 生成最多3位数的随机用户名有时会产生4位数

时间:2018-05-11 10:35:48

标签: c# random

我必须编写方法来生成随机用户名,其中包含8个字符,由小写字母和最多3位数字组成。所以我写了以下方法:

    public string UsernameGenerator()
    {
        const string letters = "abcdefghijklmnopqrstuvwxyz";
        const string digits = "0123456789";
        var builder = new StringBuilder();
        Random random = new Random((int)DateTime.Now.Ticks);
        int numberOfNumerics = random.Next(0, 4);

        for (int i = 0; i < 8; i++)
        {        
            var l = letters[random.Next(0, letters.Length)];
            builder.Append(l);
        }

        for (int i = 0; i < numberOfNumerics; i++)
        {
            int replaceIndex = random.Next(0, 8);
            var d = digits[random.Next(0, digits.Length)];
            builder.Replace(builder[replaceIndex],d);
        }

        return builder.ToString();
    }

但是,它会不时生成包含4位数的用户名。我的numberOfNumerics变量是random.Next(0,4),根据文档它应该从0到3返回随机数。看起来额外的数字是已经使用的数字之一的副本,并且它通常彼此相邻放置。错误生成密码的一些示例:

  

ko90w09q,qs2b22m6,yh38wa88,x66uvf36

是的,将random.Next(0, 4);更改为random.Next(0, 3);有点可以解决问题,因为它会不时生成3位数的用户名,但它间接解决了我的问题。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:6)

抱歉,我之前的回答与您的问题无关。我现在正在写一个更好的新作品。

因此,您生成一些包含八个NON-UNIQUE字符的序列。说,它是&#34; koabwbaq&#34;。然后你用

func(*position_args, **keyword_args)

替换&#39; a&#39;的所有出现9.你得到&#34; ko9bwb9q&#34;。然后将所有&#39; b替换为0,最后以&#34; ko90w09q&#34;结束。那就是它。

答案 1 :(得分:4)

Random.Next导致错误,因为您循环条件Next即使i < numberOfNumerics可以返回4,因此您只循环3个数字。所以这是正确的。

错误是由错误的逻辑引起的。你使用:

builder.Replace(builder[replaceIndex],d);

用您的数字替换所有出现的字母。你想使用:

builder[replaceIndex] = d;

但是您应该存储已经替换的索引,否则您可以替换相同的索引:

var replacedIndexes = new HashSet<int>();
for (int i = 0; i < numberOfNumerics; i++)
{
    int replaceIndex = random.Next(0, builder.Length);
    while (!replacedIndexes.Add(replaceIndex))
        replaceIndex = random.Next(0, builder.Length);
    char d = digits[random.Next(0, digits.Length)];
    builder[replaceIndex] = d;
}