[英]How to make a member function of a class in C++ generate a different random number each time it is called?
我有一堂課,其中還包括一個隨機數引擎及其分布:
#include <iostream>
#include <cmath>
#include <random>
#include <chrono>
class C
{
public:
typedef std::mt19937_64 engine;
typedef std::uniform_real_distribution<double> distribution;
.
.
.
protected:
engine rng;
distribution dist;
void func();
.
.
.
};
由於構造函數僅被調用一次,因此將種子放入其中:
C::C()
{ .
.
.
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
distribution dist(0.0, pow(10,12));
engine rng(seed);
}
以下成員函數應該生成一個隨機數,並且在程序的一次運行中將被多次調用:
void C::func()
{ .
.
.
double randNum = floor(dist(rng));
std::cout << randNum << std::endl;
.
.
.
}
但是,每次生成數字0作為隨機數。 似乎dist(rng)
並未完成其工作。
我真的需要找到問題並更正輸出。 我將不勝感激任何幫助。
您可以在類中定義dist
和eng
變量
protected:
engine rng;
distribution dist; // Here
void func();
然后在構造函數中定義另一個同名
C::C()
{ .
.
.
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
distribution dist(0.0, pow(10,12)); // Here
engine rng(seed);
}
我假設您希望后者是一個賦值,而不是一個新變量。 然后,您將獲得所需的號碼。
C::C()
{ .
.
.
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
dist = distribution(0.0, pow(10,12)); // Here
rng = engine(seed);
}
或初始化
C() : dist(0.0, pow(10, 12)),
rng(std::chrono::system_clock::now().time_since_epoch().count())
薩米(Sami)接近,但您應該真正初始化這些成員:
C::C()
: dist(0.0, pow(10, 12))
, rng(std::chrono::system_clock::now().time_since_epoch().count())
{}
在構造函數中,您要創建一個局部變量dist
,該變量將隱藏類成員,而該類成員將被默認初始化。 默認初始化的uniform_real_distribution
生成[0,1)范圍內的值,該floor
將始終變為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.