1

重複の可能性:
乱数ジェネレーターは1つの乱数のみを生成します

以下の私のコードはこれを行っていますが、理由はわかりません:

toEmailAddresses配列に2つの電子メールアドレスが含まれている場合、メソッド呼び出しから生成されたものuniqueID[0]uniqueID[1]同じ値が返されます。Util.CreateRandomPassword(16)

コードをステップスルーすると、との両方uniqueID[0]uniqueID[1]異なる値が含まれるようになります。しかし、通常どおりコードを実行すると、何らかの理由で、同じ値がuniqueID配列 uniqueID[0]に割り当てられuniqueID[1]ます。同じ値が含まれます。

を入れて、string tempRandomPassword = nullそれをメソッドから返された値に割り当てることもCreateRandomPasswordできますが、それも機能しません。

私は何が間違っているのですか?

//toEmailAddresses.Count array will have two e-mail addresses in it.

string[] uniqueID = new string[2];

for (int i = 0; i < toEmailAddresses.Count(); i++)
{
   string tempRandomPassword = null;
   tempRandomPassword = Util.CreateRandomPassword(16);

   uniqueID[i] = tempRandomPassword;
}


        public static string CreateRandomPassword(int passwordLength)
        {
            //http://madskristensen.net/post/Generate-random-password-in-C.aspx

            string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
            char[] chars = new char[passwordLength];
            Random rd = new Random();

            for (int i = 0; i < passwordLength; i++)
            {
                chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
            }

            return new string(chars);
        }
4

4 に答える 4

1

それはあなたの方法が使用するためです

 Random rd = new Random();

Randomのこのローカルインスタンスは、クロックを使用して自動初期化されますが、2つのインスタンスが(時間内に)非常に接近して作成されると、同じシードを使用し、同じランダムシーケンスを生成します。

複数のスレッドからこれを呼び出さない限り、単純な修正として静的フィールドを使用できます。

    private static Random _rd = new Random();

    public static string CreateRandomPassword(int passwordLength)
    {
        string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
        char[] chars = new char[passwordLength];
        // Random rd = new Random();

        ...
    }
于 2013-01-04T20:32:09.067 に答える
1

毎回新しいランダムオブジェクトを作成します。これはデフォルトのシードとして時間を使用するため、同じシード、つまり同じ数を取得します。

それをクラスのフィールドにして、一度だけ作成します。

ちなみにそれをステップスルーしたときにそれが機能したのはこのためです。余分な時間により、シードが変更され、異なる結果が返されました。

于 2013-01-04T20:32:25.263 に答える
1

Randomすべての呼び出しでデフォルトのシードを使用しての新しいインスタンスを作成しています。シードが同じである場合、同じ数列が生成されます。インスタンスを保存し、それをすべての呼び出しに使用します。

于 2013-01-04T20:32:42.447 に答える
-1

ループでスレッドスリープを使用する

private void button3_Click(object sender, EventArgs e)
        {
            string[] uniqueID = new string[2];
            string[] toEmailAddresses = new string[2];
            toEmailAddresses[0] = "a@1.com";
            toEmailAddresses[1] = "b@1.com";

            for (int i = 0; i < toEmailAddresses.Count(); i++)
            {
                uniqueID[i] = CreateRandomPassword(16);
                System.Threading.Thread.Sleep(10);               
            }

            for (int i = 0; i < uniqueID.Count(); i++)
                MessageBox.Show(i.ToString() + " : " + uniqueID[i]);
        }
于 2013-01-04T20:48:53.547 に答える