rango - numeros aleatorios en c++ sin repetir
¿Es posible aleatorizar una matriz de elementos int? (5)
Debe pasar los punteros a a[0]
y a[10]
, no a los elementos en sí:
random_shuffle(&a[0], &a[10]); // end must be 10, not 9
En C ++ 11, puedes usar std::begin
y std::end
:
random_shuffle(std::begin(a), std::end(a));
Estaba leyendo sobre esto: http://www.cplusplus.com/reference/algorithm/random_shuffle/ y me pregunté si es posible aleatorizar una matriz de elementos int. Este es mi codigo
#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;
}
Tengo este error
error C2893: Failed to specialize function template
''iterator_traits<_Iter>::difference_type *std::_Dist_type(_Iter)''.
Mi pregunta es:
¿Es posible mezclar una matriz int usando
random_shuffle
? Si es así, me gustaría aprender cómo hacerlo.¿Es
random_shuffle
solo aplicable a las plantillas?¿Qué significa mi error?
El simple hecho de cambiar la arr a un puntero no resuelve la solución. Esto hará que la matriz cambie a un tipo de permutación. Esto significa que si vuelve a ejecutar el programa, su matriz se mezclará de la misma manera que lo hizo en la ejecución anterior.
Para solucionar esto, la función ofrece un tercer parámetro que actúa como una semilla. Así que la correcta implementación de la función es la siguiente.
1) Tener una función o una lamda que genere un número aleatorio. Esto actuará como tu semilla.
int myrandom (int i) { return std::rand()%i;}
Asegúrese de establecer la semilla del generador interno de números aleatorios.
std::srand ( unsigned ( std::time(0) ) );
2) Inserte esta función como el tercer argumento en la llamada a la función random_shuffle.
std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);
Esto dará como resultado una matriz aleatoria siempre aleatoria. Asegúrese de incluir lo siguiente:
#include <algorithm> // std::random_shuffle
#include <vector> // std::vector
#include <ctime> // std::time
#include <cstdlib> // std::rand, std::srand
Trabajó para mí de esta manera:
#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;
}
Tratar de reemplazar
random_shuffle(a[0],a[9]);
con
random_shuffle(&a[0], &a[10]);
De: http://www.java2s.com/Code/Cpp/STL-Basics/Userandomshufflealgorithmswitharray.htm
random_shuffle
toma iteradores, en lugar de elementos. Prueba cualquiera
std::random_shuffle(a, a + 10);
o
std::random_shuffle(std::begin(a), std::end(a));
std::random_shuffle
se puede usar en cualquier par de iteradores de acceso aleatorio, y mezclará los elementos en el rango indicado por esos iteradores.
El error se produce porque los int
s no son iteradores, por lo que std::random_shuffle
no puede usar los int
s dados como iteradores.