当我正确地为我的生成器设置种子时,为什么会得到相同的随机数?

Ada*_*sik 2 c++ random random-seed

我正在尝试制作一个迷你彩票模拟器。我想生成 8 个随机数,最小为 1,最大为 20。我将这些生成的数字存储在Lottery对象中。我有一个LotteryManager类,我可以在其中决定生成这些彩票的次数。但我总是得到相同的随机数。我播种了发电机,所以我不明白它有什么问题。任何帮助表示赞赏!

这是我的彩票课:

class Lottery
{
private:
    vector<int> lotteryA;
    int lotteryB;
public:
    Lottery();

    vector<int> getLotteryA() const;
    int getLotteryB() const;

    void generateLotteryA();
    void generateLotteryB();
    void printLottery() const;
};
Run Code Online (Sandbox Code Playgroud)

这是管理它的类:

class LotteryManager
{
private:
    unsigned int quanity = 0;
    map<unsigned int, Lottery> lotteries;
public:
    LotteryManager();
    LotteryManager(unsigned int q);

    unsigned int getQuanity() const;
    void setQuanity(unsigned int value);

    void generateLotteries();
    void printLotteries() const;
};
Run Code Online (Sandbox Code Playgroud)

这是我的主要代码:

LotteryManager* lm = new LotteryManager(100);
    lm->generateLotteries();
    lm->printLotteries();
Run Code Online (Sandbox Code Playgroud)

LotteryManager类中的 generate 和 print 函数:

void LotteryManager::generateLotteries()
{
    for(unsigned int i = 0; i < getQuanity(); ++i)
    {
        Lottery l;
        l.generateLotteryA();
        l.generateLotteryB();
        lotteries.insert(make_pair(i, l));
        l.printLottery();
    }
}

void LotteryManager::printLotteries() const
{
    cout << "Lotteries:" << endl;
    for(auto current : lotteries)
    {
        cout << current.first << ".: ";
        current.second.printLottery();
    }
}
Run Code Online (Sandbox Code Playgroud)

Lottery类中的generate函数:(generate A和B只是不同的领域,因为游戏旨在模仿名为Putto的游戏,你需要从A领域的20中猜出8个数字,从4中的4个中猜出1个数字。领域 B)

void Lottery::generateLotteryA()
{
    random_device rn_d;
    mt19937 rng(rn_d());
    uniform_int_distribution<int> dist(1, 20);
    for(unsigned int i = 0; i < 8; ++i)
    {
        lotteryA.push_back(dist(rng));
    }
}

void Lottery::generateLotteryB()
{
    srand(time(0));
    lotteryB = (rand() % 20) + 1;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

cig*_*ien 5

Lottery::generateLotteryA你声明一个随机引擎和随机设备。每次调用此函数时,引擎都会使用相同的随机设备进行播种,因此您可以获得相同的结果。


rn_d()每次使用不同的random_devices调用将生成不同的值似乎是合理的。但是,这不是必需的,如参考文献中所述:

...每个 std::random_device 对象可以生成相同的数字序列。

在实践中,大多数实现生成不同的值,所以这不是一个真正的问题。您甚至可以将其视为标准库中没有做出此保证的缺陷。但是,正如当前指定的那样,您可以看到正在生成相同的值。


最简单的解决方法是使 engine static,所以它只在第一次调用函数时被播种:

void Lottery::generateLotteryA()
{
    // ...
    static mt19937 rng(rn_d());
    // ...
}
Run Code Online (Sandbox Code Playgroud)