首页 > 解决方案 > C++ 随机数生成器只生成 0 - C++ 11

问题描述

我正在尝试为 C++ 程序生成一个介于 0 和 2(含)之间的随机数:

#include <iostream>
#include <string>
#include <cstdlib>
#include <random>

using namespace std;

    int generateRowMovement(){
        //http://www.cplusplus.com/reference/random/uniform_int_distribution/
        default_random_engine generator;
        uniform_int_distribution<int> distribution(0,2);
        int row = distribution(generator);
        return row;
    }

int main(){
    int row = generateRowMovement();
    cout << row << endl;

    int row2 = generateRowMovement();
    cout << row2 << endl;

    int row3 = generateRowMovement();
    cout << row3 << endl;

    return 0;
}

所有 3 个结果是:

0
0
0

我已经测试了 30 分钟,它总是为零。我已尝试关注此链接和此SO 帖子将链接发回),但他们的解决方案都无法解决此问题。如何生成 0、1 和 2?

标签: c++c++11random

解决方案


您发布的代码存在两个问题,使其无法按照您的预期工作。第一个generator是从来没有给过种子,或者像网上通常显示的那样,a random_device,即

random_device rd;
default_random_engine generator(rd());

第二个是每次调用函数时,都会创建一个的随机引擎和一个的分布。最好创建一个随机设备,仅将其提供给引擎一次,然后让您的函数根据这些值返回值。

#include <iostream>
#include <string>
#include <cstdlib>
#include <random>

using namespace std;

random_device rd;
default_random_engine generator(rd());
uniform_int_distribution<int> distribution(0,2);

int generateRowMovement(){
    return distribution(generator);
}

int main(){
    int row = generateRowMovement();
    cout << row << endl;

    int row2 = generateRowMovement();
    cout << row2 << endl;

    int row3 = generateRowMovement();
    cout << row3 << endl;

    return 0;
}

推荐阅读