web-dev-qa-db-fra.com

Est-il possible de random_shuffle un tableau d'éléments int?

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:

  1. Est-il possible de mélanger un tableau int en utilisant random_shuffle. Si oui, j'aimerais apprendre à le faire.

  2. random_shuffle s'applique-t-il uniquement aux modèles?

  3. Qu'est-ce que mon erreur signifie?

18
Computernerd

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));
43
dasblinkenlight

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 ints ne sont pas des itérateurs et donc std::random_shuffle ne peut pas utiliser les ints donnés en tant qu'itérateurs.

3
Mankarse

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

3
Theo20185

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;
}
0
Renato Aloi

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
0
Grant Wilson