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 になります。彼らのためにifを作りました。

ばかげているかもしれませんが、それは私の独自の考えです。そのため、ボタンをクリックすると、最初は配列の要素が約 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 を 3 回呼び出すと、3 つの異なる番号が返されます。このため、3 つの 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 (Convert.ToInt64(r.Next()) % 3 == 0)
  ...
else if (Convert.ToInt64(r.Next()) % 3 == 1)
  ...
else if (Convert.ToInt64(r.Next()) % 3 == 2)
  ...

条件ごとに新しい乱数を選択しているため、29.63% の確率でどちらも真ではありません。

結果をよく見ると、ほとんどの場合、変化しない文字がいくつかあることがわかります。

乱数を 1 つ選び、その値を確認する必要があります。

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 に答える
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]));
}

等...

于 2012-11-03T21:22:38.170 に答える