C#生成多个不同随机密码时输出全部重复该如何解决?
问题原因
C#中Random类的默认构造函数以当前系统时钟作为种子生成随机序列,你代码中每次调用CreateRandomPassword方法时都会重新实例化一个Random对象,而循环执行速度极快,多次实例化操作间隔小于系统时钟的更新精度,导致所有Random对象使用了相同的种子,最终生成的随机序列完全一致,输出的5个密码也就全部相同。
修改方案
把Random实例从CreateRandomPassword方法内部提取到全局,让所有密码生成逻辑共用同一个Random实例即可解决重复问题。修改后的完整代码如下:
// 全局共用同一个Random实例,避免重复初始化导致种子相同 private static Random random = new Random(); static void Main(string[] args) { int length = 7; int n = 5; for (int i = 0; i < n; i++) { string pass = CreateRandomPassword(length); Console.WriteLine("Password: " + pass); } Console.ReadLine(); } private static string CreateRandomPassword(int length) { string validChars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@$#?%&"; char[] chars = new char[length]; for (int i = 0; i < length; i++) { chars[i] = validChars[random.Next(0, validChars.Length)]; } return new string(chars); }
可选优化
如果后续需要生成安全性要求更高的密码(非作业场景),可以改用.NET提供的加密级随机数生成器RandomNumberGenerator,随机性更强,不会出现种子重复问题。
内容的提问来源于stack exchange,提问作者New Here
相关产品推荐
相关产品推荐

