如何为mutateSequence函数编写双概率分支的if语句逻辑?
实现指定概率的条件分支逻辑
要实现两个分别以 4p/5 和 p/5 概率触发的条件分支,核心思路是利用均匀分布的随机数和概率阈值做比较。以下是具体实现方案:
关键前提
首先要确保随机数的生成是均匀且可靠的,推荐使用C++11引入的 <random> 标准库(比老旧的 rand() 精度更高、分布更均匀)。
代码实现
方案1:互斥分支(推荐,总触发概率为p)
这种场景下,两个分支不会同时执行,要么进第一个、要么进第二个、要么都不进,符合多数突变逻辑的需求:
#include <random> // 需要引入这个头文件 void mutateSequence(vector<pair<string, string>> v, int k, double p) { // 静态随机数生成器:仅第一次调用函数时初始化,避免重复重置导致随机数重复 static std::random_device rd; static std::mt19937 gen(rd()); static std::uniform_real_distribution<double> dis(0.0, 1.0); for (int i = 0; i < k - 1; i++) { string subjectSequence = v[i].second; for (int j = 0; j < subjectSequence.length(); j++) { double rand_val = dis(gen); // 生成[0.0, 1.0)区间的均匀随机数 const double prob_first = 4.0 * p / 5.0; const double prob_second = p / 5.0; // 以4p/5的概率进入第一个分支 if (rand_val < prob_first) { // 执行第一个逻辑 } // 以p/5的概率进入第二个分支(和第一个分支互斥) else if (rand_val < prob_first + prob_second) { // 执行第二个逻辑 } } } }
方案2:独立分支(两个分支可同时触发)
如果需要两个分支各自独立触发(可能同时执行),需要生成两个独立的随机数分别判断:
#include <random> void mutateSequence(vector<pair<string, string>> v, int k, double p) { static std::random_device rd; static std::mt19937 gen(rd()); static std::uniform_real_distribution<double> dis(0.0, 1.0); for (int i = 0; i < k - 1; i++) { string subjectSequence = v[i].second; for (int j = 0; j < subjectSequence.length(); j++) { const double prob_first = 4.0 * p / 5.0; const double prob_second = p / 5.0; // 第一个分支:4p/5概率触发 if (dis(gen) < prob_first) { // 执行第一个逻辑 } // 第二个分支:p/5概率触发(独立于第一个分支) if (dis(gen) < prob_second) { // 执行第二个逻辑 } } } }
注意事项
- 不要在循环内部初始化随机数生成器,否则每次循环都会重置种子,导致随机数失去随机性。
- 若必须兼容旧C++标准使用
rand(),可以用static_cast<double>(rand()) / RAND_MAX生成[0,1)区间的随机数,但需在程序开头调用srand(time(nullptr))初始化种子,且该方式精度和均匀性不如<random>库。
内容的提问来源于stack exchange,提问作者Daniel Lobo
相关产品推荐
相关产品推荐

