QT::QRandomGenerator数类(高质量随机)

  • QRandomGenerator数类(高质量随机)

    #include <QRandomGenerator>

    种子值(seed)是为了确保随机数序列的可重复性,可预测性(类似随机数参数的序列规则,如果多个随机数,是相同的随机种子,那么在相同范围内,出现相同值的几率会越大?)

    种子值和随机数生成器之间是初始化和生成序列的关系,如果使用了global(),system()等随机数生成器就不需要手动产生种子值了

    //手动设置种子值
    quint32 seed = 1234;
    QRandomGenerator customGenerator(seed);
    customGenerator.bounded(100);//[0,99]

    随机数发生器

    1. QRandomGenerator::global() //短期内使用,生成数量较小

    QRandomGenerator globalGenerator = QRandomGenerator::global();
    //生成一个随机整数[0,99]
    int randomInt = globalGenerator.bounded(100);
    ​
    //随机产生一个随机双精度浮点数(0.0,1.0)
    globalGenerator.generateDouble(); 

    2.QRandomGenerator::system()//需要高质量,不可预测的随机数的场景(加密,游戏等)

    QRandomGenerator ranSys = QRandomGeneratro::system();
    int value = ranSys.bounded(100);

    3.QRandomGenerator::securelySeeded() //需要安全性和不可预测性的随机数生成场景非常有用(加密,密码生成,令牌生成)

    QRandomGernerator ranse = QRandomGenerator::securelySeeded();
    ​
    
    

    </

<think>好的,我现在需要解决用户在Qt5.9中生成随机的问题。用户提到QRandomGenerator和qrand需要替代方法,但Qt5.9可能没有QRandomGenerator,因为QRandomGenerator是在Qt5.10引入的。首先,我得确认Qt5.9可用的随机生成方法。 我记得在Qt5.9中,传统的qrand()和qsrand()可能还在,但可能被废弃了。不过用户可能无法使用QRandomGenerator,所以得找其他方法。根据用户提供的引用,比如引用[2]提到Qt6.4废弃了某些函,但这里需要关注Qt5.9的情况。 可能的解决方案包括使用qrand和qsrand,或者C++标准库中的函,比如std::rand和std::srand。需要检查这些在Qt5.9中的可用性。另外,用户可能需要跨平台的方法,确保生成的随机范围正确。 还需要考虑线程安全的问题,qrand是线程不安全的,而C++的std::rand也是似的。但在Qt5.9环境下,如果用户不需要多线程,可能这不成问题。另外,如果用户需要更高质量随机,可能需要建议其他方法,比如使用操作系统提供的API,但这可能增加复杂性。 总结下来,可能的步骤是:1. 使用qrand和qsrand,但注意它们已被废弃;2. 改用C++11的<random>库,比如std::mt19937引擎,生成更高质量随机;3. 结合QtC++标准库的方法。 需要验证这些方法在Qt5.9中的可行性,比如C++11的支持情况。Qt5.9默认应该支持C++11,所以使用std::random_device和分布函是可行的。然后,将这些方法用示例代码展示,确保语法正确,并符合用户的代码环境。 最后,生成相关问题,比如线程安全、范围设置、性能比较等,帮助用户进一步了解相关主题。同时注意引用用户提供的引用内容,但现有的引用可能不直接相关,需要判断是否需要提及。例如引用[3]提到编译严格度的问题,可能在用户代码中需要注意型转换等问题,但可能与此问题关联不大。因此,可能在回答中不直接引用,但需注意示例代码的正确性以避免编译错误。</think>在Qt5.9中生成随机的常用方法及替代方案如下: ### 1. 传统方法`qrand`和`qsrand` 虽然Qt官方已标记`qrand`和`qsrand`为废弃函Qt5.10+推荐使用`QRandomGenerator`),但在Qt5.9中仍可正常使用: ```cpp #include <QtGlobal> #include <QTime> // 初始化种子 qsrand(QTime::currentTime().msec()); // 生成[0, 32767)范围内的随机 int randomValue = qrand(); // 生成指定范围的随机(例如[0, 99]) int boundedRandom = qrand() % 100; ``` 注意:此方法生成的随机质量较低且线程不安全[^1]。 ### 2. C++11标准库方法 Qt5.9默认支持C++11标准,可使用`<random>`库实现高质量随机: ```cpp #include <random> // 初始化随机引擎 std::random_device rd; std::mt19937 gen(rd()); // 定义分布范围(例如[1, 100]) std::uniform_int_distribution<> dist(1, 100); // 生成随机 int randomNumber = dist(gen); ``` 此方法支持多种分布型(均匀分布、正态分布等),且线程安全[^2]。 ### 3. 混合方法(Qt+C++) 结合Qt的时间戳与C++随机库实现种子初始化: ```cpp #include <QDateTime> #include <random> std::mt19937_64 engine(QDateTime::currentMSecsSinceEpoch()); std::uniform_real_distribution<double> dist(0.0, 1.0); double randomDouble = dist(engine); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值