QT/C++中QRandomGenerator始终生成相同值的问题求助
QRandomGenerator每次生成相同数值的解决方法
问题原因
你每次执行这段代码时都新建了一个QRandomGenerator对象,默认构造的QRandomGenerator会用固定的默认种子初始化,导致每次生成的随机序列完全一致,所以每次都会得到第一个值0,自然一直返回dmpcY1。
解决步骤
1. 复用QRandomGenerator实例并正确初始化
不要每次创建新的实例,应该把它定义为类成员变量或者全局变量,并且用系统随机源初始化种子,确保每次程序运行的随机序列都不一样。
比如在类的头文件里声明:
#include <QRandomGenerator> class YourClass : public QWidget { Q_OBJECT private: QRandomGenerator m_rng; // 类成员的随机生成器 };
然后在类的构造函数里初始化:
YourClass::YourClass(QWidget *parent) : QWidget(parent), m_rng(QRandomGenerator::system()) // 用系统随机源初始化种子 { // 其他初始化代码 }
2. 简化随机选择逻辑
把所有目标向量放到一个容器里,避免冗长的if-else判断,直接通过随机索引取值:
// 替换你的原有逻辑,这里的YourVectorType要换成你实际的向量类型 QVector<YourVectorType> dmps = {dmpcY1, dmpcY2, dmpcY3, dmpcY4, dmpcY5, dmpcY6, dmpcY7}; int index = m_rng.bounded(dmps.size()); // 用容器大小自动适配,不用硬编码数字 return dmps[index];
这样每次点击按钮时,都会从m_rng的序列里取下一个随机数,不会重复得到相同的索引。
额外说明
- 如果用全局变量的话,初始化可以这样写:
QRandomGenerator g_rng(QRandomGenerator::system());
之后在函数里直接调用g_rng.bounded(...)即可。
- 核心问题就是不要每次调用都新建QRandomGenerator实例,固定种子的重复初始化才会导致相同结果。
内容的提问来源于stack exchange,提问作者pgogo
相关产品推荐
相关产品推荐

