C++用rand生成随机密码每次序列相同的解决方法咨询
问题原因
你使用的C标准库rand()函数生成的是伪随机数,默认使用固定的初始种子,所以每次程序运行时生成的随机数序列完全相同,最终输出的密码自然一致。
解决方法
方法1:使用srand()设置随机种子(最快捷修复)
你只需要做两处修改即可:
- 引入
<ctime>头文件,用于获取系统时间 - 在程序启动后、第一次调用
rand()之前,用当前系统时间作为种子初始化随机数生成器
修改后的main函数示例:
#include <ctime> // 新增头文件 int main() { srand((unsigned int)time(nullptr)); // 新增初始化随机种子的代码 generate(); return 0; }
注意:不要在循环内重复调用
srand(),否则会因为时间取值精度问题导致生成重复随机数。
方法2:使用C++11及更高版本的随机库(更推荐,随机性更强)
如果你的编译环境支持C++11及以上标准,可以用<random>库替换老旧的rand()/srand()组合,生成的随机数质量更高、分布更均匀,更适合密码生成场景。
示例的随机字符生成逻辑替换参考:
#include <random> // 全局随机数生成器,仅需初始化一次 std::random_device rd; std::mt19937 gen(rd()); char randupper() { std::uniform_int_distribution<> dis(0, 25); return 'A' + dis(gen); } // 其余randlower、randspecial、randnumbers等函数同理修改即可
额外优化提示
你当前的配置读取函数read()每次读取参数都会重复打开关闭pg_options.txt文件,建议可以一次性读取所有配置参数存入变量,减少IO操作提升效率。
内容的提问来源于stack exchange,提问作者wcyat
相关产品推荐
相关产品推荐

