乱数を取得する簡単な方法を作りたかったのですが、乱数ジェネレータは関数間でシードを失うようです。この例を複数回実行すると、生成された最初の乱数は実行ごとにランダムであり、2番目の乱数は生成されないことがわかります。これの原因は何ですか?グローバル変数の固定乱数発生器を失う
main.cppに
#include <iostream>
#include "Random.hpp"
class Global
{
public:
Global()
{
Random::seed();
std::cout << "\n" << Random::getRandom(-10, 10);//random
}
void Global::doStuff()
{
std::cout << "\n" << Random::getRandom(-10, 10);//not random
}
};
Global globalInstance;
int main()
{
globalInstance.doStuff();
return 0;
}
Random.hpp
#pragma once
#include <random>
class Random
{
public:
static void seed();
static int getRandom(int minInclusive, int maxInclusive);
private:
static std::default_random_engine gen;
static std::uniform_int_distribution<int> ints;
};
Random.cpp
#include "Random.hpp"
#include <time.h>
std::default_random_engine Random::gen;
std::uniform_int_distribution<int> Random::ints;
void Random::seed()
{
gen.seed(static_cast<unsigned int>(time(NULL)));
}
int Random::getRandom(int minInclusive, int maxInclusive)
{
std::uniform_int_distribution<int>::param_type range(minInclusive, maxInclusive);
ints.param(range);
return ints(gen);
}
あなたはgenを静的メンバーにしました。これは静的メンバーと同じように動作します。これは静的非メンバーとは異なります。 – kfsone
投稿を編集し、[mcve]を入力してください。 –
私の間違いは、最小限の完全な検証可能な例を与えておく必要があるときに、私は最小限の例を示しました。 – user46877