【问题标题】:How to run part of the code with a specified probability?如何以指定的概率运行部分代码?
【发布时间】:2016-01-22 05:24:00
【问题描述】:

我有一个变量cnt,其值通过if/else 语句检查如下:
如果cnt<=2,则拨打func
否则如果cnt > 2,则调用func,概率为P=3/(2*cnt)
如何在 C++ 中实现这种基于概率的代码执行?

void func() {
    sendMsg();
}

【问题讨论】:

  • 你生成一个介于 0 和 1 之间的随机 double D,如果 P<D 则执行代码。关于生成随机数,请参阅<random> 标头和互联网中的许多示例。
  • 您可以使用 rand() 函数生成 1 到 0 之间的随机数,并检查它是否满足运行该函数的条件。
  • PS:请勿使用rand()。它不是真的随机或接近它。它只是易于使用,但你得到的值很糟糕。
  • 你不知道如何生成随机数吗?
  • @LưuVĩnhPhúc 我确实知道如何生成随机数。我不知道的是如何使用随机数来跟踪概率。

标签: c++ c++11 random


【解决方案1】:

使用类似std::uniform_real:

#include <random>

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0, 1);

void func() {
    // Probability 0.3
    if(dis(gen) < 0.3)
        sendMsg();
}

【讨论】:

  • 这些类是用于 C++ 的吗?我的编译器似乎不理解 std::random_device 和 std::uniform_real_distribution。
  • 您应该了解如何让您的编译器使用 C++11(这是当前的主流版本)。它是哪个编译器?
  • 其实我输入make只是修改后构建项目,但是gcc --version报告gcc (GCC) 5.1.1 20150618 (Red Hat 5.1.1-4)
  • @JasonStack 好的,所以尝试将--std=c++11 添加到您的 gcc 命令行调用中。
  • 谢谢阿米。我正在修改 ns-2 c++ 代码的文件 aodv.cc 并且必须使用 make 来构建它。我在项目目录中将this post 中给出的CXXFLAGS=-g -std=c++11 -Wall -pedantic 添加到Makefile.in,但它不起作用。
【解决方案2】:

std::map::lower_bound + partial_sum + C++11 lambdas

这是一个概括,您可以轻松地给出每个 lambda 的概率。

#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <random>
#include <vector>

int main() {
    typedef std::pair<double, std::function<void()>> P;
    auto v = std::vector<P> {
        {0.2, [](){std::cout << "a" << std::endl;}},
        {0.5, [](){std::cout << "b" << std::endl;}},
        {0.3, [](){std::cout << "c" << std::endl;}}
    };
    std::partial_sum(v.begin(), v.end(), v.begin(),
        [](const P& x, const P& y){return P(x.first + y.first, y.second);}
    );
    auto m = std::map<P::first_type, P::second_type>(v.begin(), v.end());
    std::random_device r;
    std::mt19937 prng(r());
    std::uniform_real_distribution<> dist(0.0, 1.0);
    for (auto i = 0u; i < 10u; ++i) {
        auto r = dist(prng);
        std::cout << r << std::endl;
        m.lower_bound(r)->second();
        std::cout << std::endl;
    }
}

样本输出:

0.255392
b

0.0884198
a

0.8279
c

0.095513
a

0.34819
b

0.20279
b

0.327021
b

0.402535
b

0.64069
b

0.848767
c

相关:How do I select a range of values in a switch statement?

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 2021-11-14
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多