it-swarm.com.de

Kann ein Array von int-Elementen random_shuffle werden?

Ich las darüber: http://www.cplusplus.com/reference/algorithm/random_shuffle/ Und fragte mich, ob es möglich ist, ein Array von int-Elementen random_shuffle zu machen. Das ist mein 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;
}

Ich habe diesen Fehler erhalten: 

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

Meine Frage ist:

  1. Ist es möglich, ein int-Array mit random_shuffle zu mischen? Wenn ja, würde ich gerne lernen, wie es geht.

  2. Ist random_shuffle nur für Vorlagen anwendbar?

  3. Was bedeutet mein Fehler?

18
Computernerd

Sie müssen Zeiger an a[0] und a[10] übergeben, nicht an die Elemente selbst:

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

In C++ 11 können Sie std::begin und std::end verwenden:

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

random_shuffle nimmt Iteratoren statt Elemente. Versuchen Sie entweder:

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

oder

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

std::random_shuffle kann für jedes Paar von Iteratoren mit wahlfreiem Zugriff verwendet werden und mischt die Elemente in dem Bereich, der von diesen Iteratoren angegeben wird.

Der Fehler tritt auf, weil ints keine Iteratoren sind und std::random_shuffle die angegebenen ints nicht als Iteratoren verwenden kann.

3
Mankarse

Versuchen Sie es zu ersetzen

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

mit

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

Von: http://www.Java2s.com/Code/Cpp/STL-Basics/Userandomshufflealgorithmswitharray.htm

3
Theo20185

Arbeitete für mich so:

#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

Das Ändern des Arr in einen Zeiger löst die Lösung nicht. Dadurch wird das Array auf einen Permutationstyp umgestellt. Das heißt, wenn Sie das Programm erneut ausführen, wird Ihr Array auf die gleiche Art und Weise wie beim vorherigen Lauf gemischt.

Um dies zu beheben, bietet die Funktion einen dritten Parameter an, der als Startwert fungiert. Die korrekte Implementierung der Funktion ist also wie folgt.

1) Eine Funktion oder eine Lamda haben, die eine Zufallszahl generiert. Dies wird als Ihr Samen fungieren.

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

Stellen Sie sicher, dass der Startwert für den internen Zufallszahlengenerator festgelegt ist.

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

2) Fügen Sie diese Funktion als drittes Argument in den Funktionsaufruf random_shuffle ein.

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

Dies führt zu einem immer zufällig gemischten Array. Stellen Sie sicher, dass Folgendes enthalten ist:

#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::Rand, std::srand
0
Grant Wilson