void Tablero::Aleatorio(){
/*int tam=filas*columnas,c=0;
Matriz m_aux(filas,columnas);
m=m_aux;
//int col=m.Columnas();
for(unsigned int i=0;i<filas;i++){
for(unsigned int j=0;j<columnas;++j){
m.Set(i,j,c);
c++;
}
}*/
int tam=filas*columnas,fil=0,col=0,x;
bool band;
Matriz m_aux(filas,columnas);
m=m_aux;
int *v=new int[tam];
for(int i=0;i<tam;++i){
x=rand()%tam;
if(i>0){
while(band){
if(EstaElemento(v,i,x))
x=rand()%tam;
else
band=false;
}
}
band=true;
v[i]=x;
m.Set(fil,col,x);
if(col==columnas){
col=0;
++fil;
}
else
++col;
}
bool Tablero::EstaElemento(int *v,unsigned int tam, int x){
bool band=false;
for(unsigned int i=0;i<tam && !band;i++){
if(v[i]==x)
band=true;
}
return band;
}unsigned seed = (unsigned)time(NULL);seed++;
srand(seed);
x = rand() % tam;for(int i = 0; i < tam; i++, srand(seed++))
{
x = rand() % tam;
.
.
.
}bool band;while(band){#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
using namespace std;
// Genera "a_generar" números aleatorios entre 0 y "maximo"
void GenerarNumerosAleatoriosSinRepetir(int maximo, int a_generar)
{
vector<int> numeros;
// Llenar el vector con los numeros del minimo al máximo
for (int i = 0; i < maximo; i++)
{
numeros.push_back(i);
}
// Generar numeros
for (int i = 0; i < a_generar; i++)
{
if (numeros.size() > 0)
{
/* Generar una posición en el vector de números
* y coger el número de aquella posicion y borrarlo
* para que no vuelva a aparecer más.
*/
int indice = rand() % numeros.size();
cout << "Numero aleatorio: " << numeros[indice] << endl;
numeros.erase(numeros.begin() + indice);
}
else
{
cout << "No se pueden generar mas numeros." << endl;
}
}
}
int main()
{
srand(time(NULL));
GenerarNumerosAleatoriosSinRepetir(10, 5);
return 0;
}
partiéndolo por una posición aleatoria y tomando un numero de cada uno de los sub-arrays con un rand%2. Me iba muy bien con vectores muy grandes.makelele24 escribió:Si lo que necesitas es hacerlo tú mismo, una idea muy sencilla que se mantiene lineal en promedio para vectores pequeños es generar posiciones aleatorias y meter números fijos, en vez de generar números aleatorios y meterlos en posiciones fijas.
Ferdy escribió:makelele24 escribió:Si lo que necesitas es hacerlo tú mismo, una idea muy sencilla que se mantiene lineal en promedio para vectores pequeños es generar posiciones aleatorias y meter números fijos, en vez de generar números aleatorios y meterlos en posiciones fijas.
Excepto que eso no hace que las distintas distribuciones sean equiprobables. Es un error muy común.
makelele24 escribió:No me había parado a pensar si lo era o no (simplemente era una idea muy sencilla que puede intentar implementarla el OP), pero ahora que lo dices, no veo el porqué la permutación resultante no es aleatoria.
De hecho veo que dicho algoritmo lo propuso también Knuth antes que el Fisher-Yates y no está sesgado.
http://en.wikipedia.org/wiki/Shuffle#Sh ... algorithms
http://en.wikipedia.org/wiki/Knuth_shuffle
Ferdy escribió:makelele24 escribió:No me había parado a pensar si lo era o no (simplemente era una idea muy sencilla que puede intentar implementarla el OP), pero ahora que lo dices, no veo el porqué la permutación resultante no es aleatoria.
De hecho veo que dicho algoritmo lo propuso también Knuth antes que el Fisher-Yates y no está sesgado.
http://en.wikipedia.org/wiki/Shuffle#Sh ... algorithms
http://en.wikipedia.org/wiki/Knuth_shuffle
Knuth no tenía ni un año cuando Fisher y Yates lo publicaron......
Lo que tu has descrito NO es el algoritmo que esta gente propone. Por lo menos de la descripción no se infiere que tengas cuidado de no repetir posiciones ni cómo se hace.