我必须编写方法来生成随机用户名,其中包含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位数的用户名,但它间接解决了我的问题。任何帮助表示赞赏!
答案 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;
}