(C ++) Создание случайной последовательности из набора чисел 1-3 - PullRequest
0 голосов
/ 20 января 2020

Мне нужно, чтобы моя программа делала случайную последовательность из 1-3 каждый раз, но я не понимаю, как бы я использовал rand (), чтобы сделать последовательность чисел от 1 до 3 в другом порядке каждой программы. Это не может быть тот же номер снова, поэтому я не знаю, что бы я сделал, чтобы предотвратить это. Пример выполнения:

123 первого, 231 второго, 321 и т. Д. Четвертого

Что бы вы использовали для создания последовательности, не повторяющей числа

Ответы [ 3 ]

1 голос
/ 20 января 2020

Простейшим способом создания вашей последовательности будет использование std::shuffle для переупорядочения вектора, содержащего нужные значения:

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

int main()
{
    std::random_device rd;
    std::mt19937 g(rd());
    std::vector<int> elements = { 1, 2, 3 };
    std::shuffle(elements.begin(), elements.end(), g);
    for (int i : elements)
    {
        std::cout << i << "\n";
    }
}

Если вам действительно нужно использовать rand() (обычно это не очень хорошо генератор случайных чисел) вы можете просто сжать его в shuffle:

#include <vector>
#include <algorithm>
#include <ctime>
#include <iostream>

struct RandDevice
{
    using result_type = uint32_t;
    static result_type max() { return static_cast<result_type>(RAND_MAX); };
    static result_type min() { return 0; };

    result_type operator()() {
        return static_cast<result_type>(rand());
    }
};

int main()
{
    std::vector<int> elements = { 1, 2, 3 };
    srand(time(0));
    std::shuffle(elements.begin(), elements.end(), RandDevice());
    for (int i : elements)
    {
        std::cout << i << "\n";
    }
}
0 голосов
/ 20 января 2020

это довольно легко сделать ... просто сравните число с каждым занятым элементом в массиве. если его нет в массиве, добавьте в массив. еще, попробуйте еще раз.

Я сделал аналогичный код, проверьте это

    #include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
void displayArray(int randNum[], int elements);
void randomNum(int randNums[], int elements);
int main ()
{
    //declare array
    int numbers[999] = {0};
    //random number generator
    srand(static_cast<int>(time(0)));

    randomNum(numbers, 999);
    displayArray(numbers, 999);

system("pause");
return 0;
}
void randomNum(int randNums[], int elements)
{
    for (int i = 0; i < elements; i++)
    {
        bool same;
        do
        {
            same = false;
            randNums[i] = rand() % 999 + 100;
            // Check if the newly generated number is a duplicate:
            for (int check = 0; check < i; check++)
            {
                if (randNums[i] == randNums[check])
                {
                    same = true;
                    break;
                }
            }
        } while (same);
    }
}
void displayArray(int randNum[], int elements)
{
    for (int sub = 0; sub < elements; sub ++)
    {
        cout << "Unique Numbers: " << randNum[sub] << endl;
    }
}
0 голосов
/ 20 января 2020

Вы можете использовать std :: next_permutation

Пример здесь: https://en.cppreference.com/w/cpp/algorithm/next_permutation

...