你好我正在尝试创建一个函数,它会给我一个随机数,然后将它作为一个受保护的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);
}
答案 0 :(得分:0)
随机数生成器长时间存在时效果最佳。但是,您的RANDOM()方法每次调用时都会创建,播种和使用新的RNG。
如果您希望option
对象作为RNG替代,请创建实际的RNG并在构造函数中将其播种,只需一次,然后从中提取一个随机数使用你的RANDOM()方法。
请记住,创建一次RNG。当你创建它时,它一次种子。确保它存在很长时间。顺便说一句,你还应该discard()
至少有一千个数字来加热它。
无关联,ALL_CAPS告诉C和C ++人你正在使用MACRO - 但实际上你并不是。
希望这有帮助。
答案 1 :(得分:0)
这样的事情:
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;
}