当我使用Random.Next方法时,我可以省去范围内的值吗?

时间:2014-07-17 12:18:29

标签: random range

我正在制作一个密码生成器,它需要以随机顺序制作一串大写和小写字母givin。 max和min值由两个滑块指定。

我想放弃两个范围(65,90)和(97,122)的int变量,它返回charachter的数字,而不是使用两个具有不同范围的变量。

当我使用范围(65,122)时,在生成密码时会给出我不想要的字符。

    private void btnPaswoord_Click(object sender, RoutedEventArgs e)
    {
        GenereerPaswoord();
    }

    private void GenereerPaswoord()
    {
        int iMin = Convert.ToInt32(sldMin.Value);
        int iMax = Convert.ToInt32(sldMax.Value);

        txtPasw.Text = GeefPaswoord(iMin, iMax );
    }


    private string GeefPaswoord(int iMin, int iMax)
    {
        string sPaswoord ="";

        if (sldMin.Value <= sldMax.Value)
        {
        int iLengtePaswoord = moWillekeurig.Next(iMin, iMax + 1);

        for (int iTeller = 0; iTeller < iLengtePaswoord; iTeller ++ )
        {
            int iAsciiWaarde = moWillekeurig.Next(65, 123);
            char cLetter = (char)iAsciiWaarde;

            sPaswoord = sPaswoord + cLetter;
        }
            }
        else
        {
            sldMin.Value = sldMax.Value;
        }
        return sPaswoord;
    }

1 个答案:

答案 0 :(得分:0)

在这种情况下,范围很小,因此您可以生成一个字符数组,其中包含您可能要在密码中使用的所有有效字符,并从那里绘制:

var passwordChars =
    Enumerable.Range(65, 26)
      .Concat(Enumerable.Range(90, 26))
      .Select(Convert.ToChar).ToArray();;

var password = new string(
    Enumerable.Range(1, iLengtePaswoord)
      .Select(_ => moWillekeurig.Next(passwordChars.Length))
      .Select(x => passwordChars[x]));

要精确回答您的问题,您可以使用所谓的拒绝抽样。也就是说,你绘制随机数,直到得到满足你标准的数字:

int iAsciiWaarde;
do
{
    iAsciiWaarde = moWillekeurig.Next(65, 123);
} while (iAsciiWaarde <= 90 || iAsciiWaarde >= 96);