【问题标题】:Create random number with exponential distribution in c++ (visual stduio)在 C++ 中创建具有指数分布的随机数(Visual Studio)
【发布时间】:2017-07-28 20:21:39
【问题描述】:

我正在尝试创建具有指数分布的随机数。 当我用一个简单的例子进行测试时,它运行良好。 但是当我在我的项目中创建它时,它不起作用。我的项目包括许多具有不同对象的类。 我项目中的一个类:

用户.h:

#include<iostream>
#include<queue>
#include<math.h>
#include<random>
#include"Packet.h"
using namespace std;

class User {
protected:
    queue<Packet*> PacketList;
    const double rnd = 1.0 / 100;
    std::default_random_engine generator;
    exponential_distribution<> packetArrivalRate(double); // it will be error if "packetArrivalRate(1.0/100)"
public:
    void newPacket();
};

用户.cpp:

#include"User.h";

exponential_distribution<> User::packetArrivalRate(double)
{
    return exponential_distribution<>(rnd);
}

void User::newPacket()
{
    Packet* p = new Packet;
    PacketList.push(p);
    double time = packetArrivalRate(generator); //this line is error
}

谁能帮我用指数分布的随机数创建“时间”。

【问题讨论】:

  • 你得到什么错误?
  • packetArrivalRate 期望双倍,你给一个生成器。它返回一个exponential_distribution,你取一个double。
  • “它不起作用。” 请查看帮助中心:“寻求调试帮助的问题(“为什么这段代码不起作用?") 必须包含所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题是对其他读者没用。见:How to create a Minimal, Complete, and Verifiable example。"
  • 当问题陈述很简单时,很难提供解决方案,“它不起作用”。请edit您的问题更完整地描述您预期会发生什么以及这与实际结果有何不同。请参阅 How to Ask 以获取有关什么是好的解释的提示。
  • @sasuke0o01 您正在使用rnd,但未声明它。似乎应该是exponential_distribution&lt;&gt; User::packetArrivalRate(double rnd)

标签: c++ exponential-distribution


【解决方案1】:

问题是当函数需要double 时,您使用generator 是参数调用packetArrivalRate。所述函数返回一个exponential_distribution&lt;&gt;,它需要一个生成器来为您提供指数分布的数字。

解决这个问题的一个简单(而且非常难看)的方法是给packetArrivalRate一个适当的参数(注意这个参数完全被函数忽略了,所以它的值无关紧要),然后调用operator()关于返回值:

double time = packetArrivalRate(0)(generator);

另类设计

更合理的方式是不忽略参数,然后提供rnd

double time = packetArrivalRate(rnd)(generator);

并像这样定义packetArrivalRate

exponential_distribution<> User::packetArrivalRate(double lambda)
{
    return exponential_distribution<>(lambda);
}

随机引擎

请务必使用 Mersenne Twister 伪随机发生器(std::mt19937std::mt19937_64)而不是 std::default_random_engine。它们可能会提供更好的随机数。见&lt;random&gt;的作者this video

【讨论】:

  • 谢谢,但还是不行。我的 rnd 是 lambda
  • “仍然不起作用”是什么意思?它编译得很好,并且确实提供了指数分布的数字。
猜你喜欢
  • 2014-09-11
  • 2014-01-06
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2021-07-09
相关资源
最近更新 更多