Ответ 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));
Я читал об этом: 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
применимым только к шаблонам?
Что означает моя ошибка?
Вам нужно передать указатели на 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));
Попробуйте заменить
random_shuffle(a[0],a[9]);
с
random_shuffle(&a[0], &a[10]);
От: http://www.java2s.com/Code/Cpp/STL-Basics/Userandomshufflealgorithmswitharray.htm
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
как итераторы.
Работал для меня следующим образом:
#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;
}
Простое изменение 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