2016-04-20 41 views
0

我在C#中的随机密钥生成器,是应该产生如下格式的关键:C#代码生成器,元音没有显示出来

辅音+元音+辅音+元音+四个数字组合

因此,例如它可能是BABA1234或ZUZU9876。

但是,目前,虽然其他一切都显示,但是我最终得到的输出类似B_B_1234,例如下划线代表空格或无法识别的字符框。

我一直在寻找一些例子,如this,thisthis,但我还没有得到它的工作。 C#代码如下:

public static string shortText() 
{ 
    string randomNumber = new Random().Next(1000, 9999).ToString(); 
    char c1 = consonant(); 
    char c2 = vowel(); 
    System.Threading.Thread.Sleep(400); 
    char c3 = consonant(); 
    char c4 = vowel(); 

    return string.Format("{0}{1}{2}{3}{4}", c1, c2, c3, c4, randomNumber); 
} 

private static char vowel() 
{ 
    int selected = new Random().Next(0, 4); 
    List<int> list = new List<int> { 65, 69, 73, 79, 85 }; 

    return Strings.Chr(selected); 
} 

private static char consonant() 
{ 
    int selected = new Random().Next(65, 90); 
    List<int> list = new List<int> { 65, 69, 73, 79, 85 }; 

    if (list.Contains(selected) == false) 
    { 
     return Strings.Chr(selected); 
    } 
    else { 
     return Strings.Chr(selected + 1); 
    } 
} 

另外一个值得注意的是,此代码最初用VB写的(这就是为什么有在C#代码Strings.Chr上面,我加入到VB库的引用),它在那里正常工作,并根据开始时的格式生成代码。我将它转换为C#并稍微编辑以删除错误,但看起来转换并不完美。这里是VB代码:

Public Class Form1 
    Private Sub btnGenerateKey_Click(sender As Object, e As EventArgs) Handles btnGenerateKey.Click 
     txtKey.Text = shortText() 
    End Sub 

    Private Shared Function shortText() As String 
     Dim randomNumber As String = New Random().Next(1000, 9999).ToString 
     Dim c1 As Char = consonant() 
     Dim c2 As Char = vowel() 
     System.Threading.Thread.Sleep(400) 
     Dim c3 As Char = consonant() 
     Dim c4 As Char = vowel() 

     Return String.Format("{0}{1}{2}{3}{4}", c1, c2, c3, c4, randomNumber) 
    End Function 

    Private Shared Function vowel() As Char 
     Dim list As List(Of Integer) = New List(Of Integer)({65, 69, 73, 79, 85}) 

     Return Chr(list(New Random().Next(0, 4))) 
    End Function 

    Private Shared Function consonant() As Char 
     Dim selected As Integer = New Random().Next(65, 90) 
     Dim list As List(Of Integer) = New List(Of Integer)({65, 69, 73, 79, 85}) 

     If list.Contains(selected) = False Then 
      Return Chr(selected) 
     Else 
      Return Chr(selected + 1) 
     End If 
    End Function 
End Class 

任何帮助,非常感谢。

回答

3

vowel()返回随机数(即1-4)的值,而不是元音列表中的元素。

修复它通过改变

return Strings.Chr(selected); 

return Strings.Chr(list[selected]); 

其他问题

有一对夫妇的其他问题与您的代码虽然。

1)您没有正确使用随机数。每次需要一个随机数时不要创建一个新的随机实例 - 创建一个实例并将其用于随机数的所有请求。 2)由于算法的原因,你更可能得到辅音'b','f','j','p','v'。如果你在consonant()之内得到一个元音,你应该只是有一个21个字符的列表,而不是从下一个字母开始,并从该列表中获取一个随机条目。

3)为什么你要创建一个ints的列表来存储你的辅音?为什么不创建一个字符列表并避免投射。这样做会让你的实际bug很明显,因为你会得到一个编译错误:)

1

因为你没有在你的随机函数和元音列表中获取字母值。 字母以ASCII码65开始并转发。 您的代码应该是这个样子:

private static string vowel() 
{ 
    var random = new Random(); 
    var list = new List<int> { 65, 69, 73, 79, 85 }; 
    return Strings.Chr(list[random.Next(0, 4)]); 
} 

consonant同样的问题。
对于好的“随机性”,您不应该每次都实例化一个新的Random对象,而应该将其作为类中的成员字段并在所有方法中使用它。 Link to Ascii values

3

为什么你编码(65)和解码(Strings.Chr)字符?为什么不直接

private static Char[] s_Vowels = new Char[] { 
    'A', 'E', 'I', 'O', 'U', 
}; 

private static Char[] s_Consonants = new Char[] { 
    'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 
    'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 
}; 

// Simplest, not thread safe 
private static s_Random = new Random(); 

private static String shortText() { 
    StringBuilder sb = new StringBuilder(8); 

    sb.Append(s_Consonants[s_Random.Next(s_Consonants.Length)]); 
    sb.Append(s_Vowels[s_Random.Next(s_Vowels.Length)]); 
    sb.Append(s_Consonants[s_Random.Next(s_Consonants.Length)]); 
    sb.Append(s_Vowels[s_Random.Next(s_Vowels.Length)]); 

    sb.Append(s_Random.Next(1000, 10000)); 

    return sb.ToString(); 
} 
+1

只是一个小的事情:'s_Random.Next(1000,9999)'将永远不会返回它只会不断上升到9998 Next'的'第二个参数的值9999。是_exclusive_上限。 –

+0

@Chris Dunawa:谢谢!你说得很对:我应该*不复制并粘贴问题中的片段。 –