2014-07-17 41 views
0

我正在製作一個密碼生成器,它需要按隨機順序製作一個大寫和小寫字母串的字符串。最大值和最小值由兩個滑塊指定。當我使用Random.Next方法時,可以忽略範圍內的值嗎?

我想放棄兩個範圍(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; 
    } 

回答

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); 
相關問題