Как сгенерировать 4 разных случайных числа в C ++ - PullRequest
0 голосов
/ 01 июня 2019

Я делаю задание «Быкам и коровам» из книги Бьярна Страуструпа «Принципы и практика программирования на C ++» (стр. 130, упражнение 13), и я хочу, чтобы программа генерировала четыре различных целых числа в диапазоне от 0 до 9 (например, 1234, ноне 1122)

Я создал вектор для хранения чисел и функцию, которая генерирует 4 числа и добавляет их к вектору, но числа могут быть одинаковыми, и я не могу вернуть числа в основную функцию

#include "../..//..//std_lib_facilities.h"

vector<int> gen4Nums(vector<int> secNum)
{
    random_device rd; // obtain a random number from hardware
    mt19937 eng(rd()); // seed the generator
    uniform_int_distribution<> distr(0, 9); // define the range 

    secNum.clear();
    for (int i = 0; i < 4; i++)
    {
        secNum.push_back(distr(eng));
        cout << secNum[i];
    }
    return secNum;
}

int main()
{
        vector<int> secNum;
        gen4Nums(secNum);   
}

Я ожидаю вернуть 4 различных случайных числа в основную функцию

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

Похоже, вы пытаетесь сгенерировать 4 уникальных случайных целых числа в диапазоне 0 ... 9.

Вы можете сделать это, сгенерировав вектор целых чисел, содержащий значения 0 ... 9.Затем перетасуйте вектор, как хотите, чтобы он был случайным выбором целых чисел.Наконец, обрежьте вектор до желаемого размера, так как вам нужно только 4 уникальных случайных целых числа:

#include <vector>
#include <random>
#include <algorithm>
#include <numeric>

void gen4Nums(std::vector<int>& v) {
    //Generate initial vector with values 0...9:
    v.resize(10, 0);
    std::iota(v.begin(), v.end(), 0);

    //Shuffle the vector:
    std::random_device rd;
    std::mt19937 g(rd());
    std::shuffle(v.begin(), v.end(), g);

    //Trim the vector to contain only 4 integers:
    v.resize(4);
}
2 голосов
/ 01 июня 2019

Вы можете гарантировать получение разных случайных чисел в результате, если вы измените свой код следующим образом:

#include <vector>
#include <random>
#include <algorithm>

using namespace std;

vector<int> gen4Nums()
{
    vector<int> result;
    random_device rd; // obtain a random number from hardware
    mt19937 eng(rd()); // seed the generator
    uniform_int_distribution<> distr(0, 9); // define the range 

    int i = 0;
    while(i < 4) { // loop until you have collected the sufficient number of results
        int randVal = distr(eng);
        if(std::find(std::begin(result),std::end(result),randVal) == std::end(result)) {
        // ^^^^^^^^^^^^ The above part is essential, only add random numbers to the result 
        // which aren't yet contained.
            result.push_back(randVal);
            cout << result[i];
            ++i;
        }
    }
    return result;
}

int main() {
    vector<int> secNum = gen4Nums();   
}
...