0

我创建了一个“随机密码生成器”应用程序(我是初学者,只是为了练习)并且不知何故在第一次单击按钮时它只会填充我数组的 5-6-7 个元素。

这段代码可能很奇怪(用于生成随机字符),我只是查看了 ASCII 表并搜索了数字、字母并将它们放入随机的最小和最大数字中。

 string[] ch = new string [11];
 Random r = new Random();

 private void button1_Click(object sender, EventArgs e)
 {
    for (int i = 0; i <= 9; i++)
    {
        if (Convert.ToInt64(r.Next()) % 3 == 0)
            ch[i] = Convert.ToString(Convert.ToChar(r.Next(49, 57)));
         else if (Convert.ToInt64(r.Next()) % 3 == 1)
             ch[i] = Convert.ToString(Convert.ToChar(r.Next(65, 89)));
         else if (Convert.ToInt64(r.Next()) % 3 == 2)
             ch[i] = Convert.ToString(Convert.ToChar(r.Next(97, 122)));
     }
     pass.Text = (Convert.ToString(ch[0] + "" + ch[1] + "" + ch[2] + "" + ch[3] + "" + ch[4] + "" + ch[5] + "" + ch[6] + "" + ch[7] + "" + ch[8] + "" + ch[9]));   

要决定使用数字(ascii 49-57)小写字母(65-89)还是大写字母(97-122),我只是做了一个随机数(截断除以?)除以 3,然后结果是 0,1 或 2为他们做了如果。

可能很愚蠢,但这是我自己的想法。所以当我点击按钮时,第一次它只显示大约 5,6,7 个数组元素。有人知道为什么吗?

4

3 回答 3

1
if (Convert.ToInt64(r.Next()) % 3 == 0)
    ch[i] = Convert.ToString(Convert.ToChar(r.Next(49, 57)));
else if (Convert.ToInt64(r.Next()) % 3 == 1)
    ch[i] = Convert.ToString(Convert.ToChar(r.Next(65, 89)));
else if (Convert.ToInt64(r.Next()) % 3 == 2)
    ch[i] = Convert.ToString(Convert.ToChar(r.Next(97, 122)));

当您拨打 Next 三次时,您会得到三个不同的号码。因此,您可能会使所有三个 if 语句都失败。

改为这样做

int i = r.Next(3);
if (i == 1)
    ch[i] = Convert.ToString(Convert.ToChar(r.Next(49, 57)));
else if (i == 2)
    ch[i] = Convert.ToString(Convert.ToChar(r.Next(65, 89)));
else
    ch[i] = Convert.ToString(Convert.ToChar(r.Next(97, 122)));
于 2012-11-03T21:20:14.760 回答
0

您需要在 if 语句之前将结果捕获到变量中。每次执行 r.Next() 时,结果都会发生变化。

int result = Convert.ToInt64(r.Next());

private void button1_Click(object sender, EventArgs e)
 {
    for (int i = 0; i <= 9; i++)
    {
        if (result % 3 == 0)
            ch[i] = Convert.ToString(Convert.ToChar(r.Next(49, 57)));
         else if (result % 3 == 1)
             ch[i] = Convert.ToString(Convert.ToChar(r.Next(65, 89)));
         else if (result % 3 == 2)
             ch[i] = Convert.ToString(Convert.ToChar(r.Next(97, 122)));
     }
     pass.Text = (Convert.ToString(ch[0] + "" + ch[1] + "" + ch[2] + "" + ch[3] + "" + ch[4] + "" + ch[5] + "" + ch[6] + "" + ch[7] + "" + ch[8] + "" + ch[9]));
}

ETC...

于 2012-11-03T21:22:38.170 回答
0

这不仅是代码第一次未能将值放在所有位置。

你有这个控制结构:

if (Convert.ToInt64(r.Next()) % 3 == 0)
  ...
else if (Convert.ToInt64(r.Next()) % 3 == 1)
  ...
else if (Convert.ToInt64(r.Next()) % 3 == 2)
  ...

当您为每个条件选择一个新的随机数时,有 29.63% 的机会它们都不为真。

如果你仔细观察结果,你会发现大多数时候有一些字符没有变化。

您应该选择一个随机数并检查其值:

switch (r.Next(3)) {
 case 0:
   ch[i] = Convert.ToString(Convert.ToChar(r.Next(49, 57)));
   break;
 case 1:
   ch[i] = Convert.ToString(Convert.ToChar(r.Next(65, 89)));
   break;
 case 2:
   ch[i] = Convert.ToString(Convert.ToChar(r.Next(97, 122)));
   break;
}

另一种方法是将要使用的所有字符放在一个字符串中,然后从中选择:

string chars = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz";

ch[i] = chars.Substring(r.Next(chars.Length), 1);

如果您想排除一些容易混淆的字符,例如 0、O、o、1 和 l,这将特别有用,然后您只需将它们从字符串中排除:

string chars = "23456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz";
于 2012-11-03T21:37:06.980 回答