Возможно ли случайное_shuffle массив из int элементов? - программирование
Подтвердить что ты не робот

Возможно ли случайное_shuffle массив из int элементов?

Я читал об этом: http://www.cplusplus.com/reference/algorithm/random_shuffle/ и задавался вопросом, возможно ли его случайное_shuffle массив элементов int. Это мой код

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};

    cout << a << endl << endl;

    random_shuffle(a[0],a[9]);

    cout<<a;
}

Я получил эту ошибку:

error C2893: Failed to specialize function template
    'iterator_traits<_Iter>::difference_type *std::_Dist_type(_Iter)'.

Мой вопрос:

  • Можно ли перетасовать массив int с помощью random_shuffle. Если да, я хотел бы узнать, как это сделать.

  • Является ли random_shuffle применимым только к шаблонам?

  • Что означает моя ошибка?

4b9b3361

Ответ 1

Вам нужно передать указатели на a[0] и a[10], а не на сами элементы:

random_shuffle(&a[0], &a[10]); // end must be 10, not 9

В С++ 11 вы можете использовать std::begin и std::end:

random_shuffle(std::begin(a), std::end(a));

Ответ 3

random_shuffle принимает итераторы, а не элементы. Попробуйте либо:

std::random_shuffle(a, a + 10);

или

std::random_shuffle(std::begin(a), std::end(a));

std::random_shuffle может использоваться для любой пары итераторов произвольного доступа и будет перемешать элементы в диапазоне, обозначенном этими итераторами.

Ошибка возникает из-за того, что int не являются итераторами, поэтому std::random_shuffle не может использовать заданные int как итераторы.

Ответ 4

Работал для меня следующим образом:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[10]={0,1,2,3,4,5,6,7,8,9};

    for (unsigned i = 0; i < 10; i++)
    {
        cout << a[i];
    }
    cout << endl;

    random_shuffle(&a[0],&a[10]);

    for (unsigned i = 0; i < 10; i++)
    {
        cout << a[i];
    }
    cout << endl;
}

Ответ 5

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

Чтобы исправить это - функция предлагает третий параметр, который действует как семя. Таким образом, правильная реализация функции такова.

1) Имейте функцию или ламду, которая генерирует случайное число. Это будет действовать как ваше семя.

int myrandom (int i) { return std::rand()%i;}

Обязательно установите семя внутреннего генератора случайных чисел.

std::srand ( unsigned ( std::time(0) ) );

2) Вставьте эту функцию в качестве третьего аргумента в вызове функции random_shuffle.

std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);

Это приведет к случайному перетасованному массиву. Обязательно включите следующее:

#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand