4

我正在尝试编写一个随机密码生成器。我处于早期阶段,遇到了一些问题。通过下面的代码和屏幕截图,您可以看到我得到了一个非常可预测的字符串(2 的字符串)。每次我收到一个只填充一种数字的字符串。我应该如何编辑我的代码以生成更好的密码字符串?(除了包括数字以外)

在此处输入图像描述

private void button1_Click(object sender, EventArgs e)
{
    int characters = Convert.ToInt32(comboBox1.SelectedIndex);
    string password = "";

    for(int i = 0; i <= characters; i++)
    {
       password = password +charGen();
    }

    label2.Text = password;
}

private char charGen()
{
    Random random = new Random();
    char randomNumber = Convert.ToChar( random.Next(48, 57));
    return randomNumber;
}

}

4

5 回答 5

5

只需保持random在类范围内:

Random random = new Random();

private void button1_Click(object sender, EventArgs e)
{
    int characters = Convert.ToInt32(comboBox1.SelectedIndex);
    string password = "";

    for(int i = 0; i <= characters; i++)
    {
       password = password +charGen();
    }

    label2.Text = password;
}

private char charGen()
{
    char randomNumber = Convert.ToChar( random.Next(48, 57));
    return randomNumber;
}

目前,每次调用时它的种子值几乎相同charGen

于 2012-11-19T02:43:03.133 回答
3

问题是每次charGen调用时,您都会创建一个 new Random,并使用当前时钟为种子初始化。由于它们的创建速度如此之快,因此它们都获得了相同的种子。

您应该在类级别创建一个Random对象(或将其传递给charGen)。

于 2012-11-19T02:43:14.117 回答
2

为什么不使用Rnd()代替Random

Private Function charGen() As Char
  Return Chr(Asc("0"c) + Rnd() * 10)
End Function

Randomize()然后在循环之前调用。

于 2012-11-19T02:56:54.747 回答
1

您可以使用 Membership.GeneratePassword 方法

http://msdn.microsoft.com/en-us/library/system.web.security.membership.generatepassword(v=vs.110).aspx

于 2014-01-03T06:01:22.727 回答
0

使用 System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters)

于 2021-02-27T15:16:24.087 回答