4

ランダムパスワードジェネレータを作成しようとしています。私は初期段階にあり、いくつかの問題に直面しています。以下のコードとスクリーンショットを使用すると、非常に予測可能な文字列(2の文字列)を取得していることがわかります。1種類の数字だけが入った文字列を受け取るたびに。より良いパスワード文字列を生成するには、コードをどのように編集する必要がありますか?(数字だけではありません)

ここに画像の説明を入力してください

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れる新しいを作成することです。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 に答える