【问题标题】:Random number generator function in class类中的随机数生成器函数
【发布时间】:2015-11-14 17:27:09
【问题描述】:

您好,我正在尝试创建一个函数,它会给我一个随机数,然后在我的类中将它作为一个受保护的 int 返回,该整数将被继承。 我想要的是创建一个随机数(0,1),然后将其传递给继承的类 GBM。在该课程中,我需要将其用于蒙特卡罗模拟。如何创建将被继承的随机数?

头文件

#pragma once

#include <iostream>
#include <random>
#include <chrono>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::default_random_engine;
using std::normal_distribution;
using std::vector;


class option
{
private:
    float mean_ = 0.0;
    float std_ = 1.0;

protected:
    float rnum;
    void RANDOM();

public:
    option();
    virtual float get_rnum() = 0;
    virtual void simulation() = 0;
    virtual ~option() {};
};

class GBM : public option
{
public:
    GBM();
    virtual float get_rnum();
    virtual void simulation();
    virtual ~GBM () {}
};

cpp文件

#include "Option.h"
void option::RANDOM()
{
    const int N = 500000;
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::default_random_engine generator(seed);
    std::normal_distribution<float> RAND(mean_, std_);

    for (int i = 0; i <= N; i++)
    {
        rnum = RAND(generator);
    }
}


option::option()
{
}

GBM::GBM()
{
}

float GBM::get_rnum()
{
    float k;
    k = rnum;

    return (k);
}

【问题讨论】:

  • 确保每次程序运行只播种一次。
  • 避免使用std::default_random_engine,它是实现定义的。明确地使用std::mt19937
  • 永远不要从当前时间获取种子。请改用auto seed = std::random_device{}();

标签: c++ random


【解决方案1】:

随机数生成器在长期存在时效果最佳。但是,您的 RANDOM() 方法在每次调用时都会创建、播种和使用新的 RNG。

如果您希望您的 option 对象作为 RNG 替代,请创建实际的 RNG 并将其放入构造函数中,只需 一次,然后使用您的RANDOM() 方法。

请记住,创建一次您的 RNG。在您创建它时播种一次。确保它存在很长时间。顺便说一句,您还应该discard() 至少一千个数字来预热它。

不相关的是,ALL_CAPS 告诉 C 和 C++ 人你正在使用 MACRO——但实际上你没有。

希望这会有所帮助。

【讨论】:

  • 这个答案怎么没有得到任何支持?
  • 我认为,至少在这种情况下,它完全反映了人们对原始问题的关心程度。我想我还应该提到 C++ 标准 PRNG 都不适合蒙特卡洛模拟,但这是前提的问题,而不是问题的答案......虽然我在做,但我可能会为我的 CSPRNG 课程做一个无耻的插件:Google “duthomhas github csprng”。
【解决方案2】:

所以是这样的:

  void option::RANDOM()
{
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    static std::mt19937 generator(seed);
    std::normal_distribution<float> RAND(mean_, std_);
    rnum = RAND(generator);

}


option::option()
{
    float rnum;
}

【讨论】:

  • No.constructor 中创建并播种您的 RNG。 (并确保您的对象寿命长!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2016-03-18
  • 2019-02-28
  • 1970-01-01
相关资源
最近更新 更多