簡體   English   中英

如何使C ++中的類的成員函數每次調用時生成不同的隨機數?

[英]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)並未完成其工作。

我真的需要找到問題並更正輸出。 我將不勝感激任何幫助。

您可以在類中定義disteng變量

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM