Je lisais ceci: http://www.cplusplus.com/reference/algorithm/random_shuffle/ Et je me suis demandé s'il était possible de randomiser un tableau d'éléments int. C'est mon code
#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;
}
J'ai eu cette erreur:
error C2893: Failed to specialize function template
'iterator_traits<_Iter>::difference_type *std::_Dist_type(_Iter)'.
Ma question est:
Est-il possible de mélanger un tableau int en utilisant random_shuffle
. Si oui, j'aimerais apprendre à le faire.
random_shuffle
s'applique-t-il uniquement aux modèles?
Qu'est-ce que mon erreur signifie?
Vous devez passer les pointeurs sur a[0]
et a[10]
, pas les éléments eux-mêmes:
random_shuffle(&a[0], &a[10]); // end must be 10, not 9
En C++ 11, vous pouvez utiliser std::begin
et std::end
:
random_shuffle(std::begin(a), std::end(a));
random_shuffle
prend des itérateurs plutôt que des éléments. Essayez soit:
std::random_shuffle(a, a + 10);
ou
std::random_shuffle(std::begin(a), std::end(a));
std::random_shuffle
peut être utilisé sur n’importe quelle paire d’itérateurs à accès aléatoire, et mélangera les éléments dans la plage indiquée par ces itérateurs.
L'erreur se produit parce que int
s ne sont pas des itérateurs et donc std::random_shuffle
ne peut pas utiliser les int
s donnés en tant qu'itérateurs.
Essayez de remplacer
random_shuffle(a[0],a[9]);
avec
random_shuffle(&a[0], &a[10]);
De: http://www.Java2s.com/Code/Cpp/STL-Basics/Userandomshufflealgorithmswitharray.htm
A travaillé pour moi de cette façon:
#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;
}
Changer simplement l'arr en pointeur ne résout pas la solution. Cela fera que la matrice bascule vers un type de permutation. Cela signifie que si vous réexécutez le programme, votre tableau sera mélangé exactement de la même manière que lors de l'exécution précédente.
Pour résoudre ce problème, la fonction propose un troisième paramètre qui agit comme une graine. Donc, la mise en œuvre correcte de la fonction est la suivante.
1) Avoir une fonction ou une lamda qui génère un nombre aléatoire. Cela agira comme votre graine.
int myrandom (int i) { return std::Rand()%i;}
Assurez-vous de définir le germe du générateur de nombre aléatoire interne.
std::srand ( unsigned ( std::time(0) ) );
2) Insérez cette fonction en tant que troisième argument dans l'appel de la fonction random_shuffle.
std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);
Cela entraînera un tableau toujours aléatoire aléatoire . Assurez-vous d'inclure les éléments suivants:
#include <algorithm> // std::random_shuffle
#include <vector> // std::vector
#include <ctime> // std::time
#include <cstdlib> // std::Rand, std::srand