PDA

View Full Version : [c++]creazione array di numeri random senza che essi si ripetino


tizioquick
10-07-2009, 18:44
Ciao ragazzi,(premetto che sono un principiante) è da un pò di tempo che stavo cercando di creare un progettino che creasse un array di numeri interi random senza che essi si ripetino una volta che sono usciti una volta, apparentemente non mi sembrava difficile,però ho provato in centinaia di modi ma o mi dava errore o nn funzionava bene, sono arrivato al punto che il programma si bloccava e mi diceva che lo stack intorno all'array era corrotto.
potete per caso darmi una mano su come fare?
#include<iostream>
#include<stdlib.h>
using namespace std;
void
main(void)
{
int tur[7],err[10],buf,con=0;
for(int i=0;i<=7;i++)
{
err[i]=0;
}
for(int i=0;i<=(7+con);i++)
{
buf=rand()%12;
if(buf==1 && err[0]==0)
{
err[0]=1;
con++;
tur[i-con]=1;
}
if(buf==2 && err[1]==0)
{
err[1]=1;
con++;
tur[i-con]=2;
}
if(buf==3 && err[2]==0)
{
err[2]=1;
con++;
tur[i-con]=3;
}
if(buf==4 && err[3]==0)
{
err[3]=1;
con++;
tur[i-con]=4;
}
if(buf==5 && err[4]==0)
{
err[4]=1;
con++;
tur[i-con]=5;
}
if(buf==6 && err[5]==0)
{
err[5]=1;
con++;
tur[i-con]=6;
}
if(buf==7 && err[6]==0)
{
err[6]=1;
con++;
tur[i-con]=7;
}
if(buf==8 && err[7]==0)
{
err[7]=1;
con++;
tur[i-con]=8;
}
if(buf==9 && err[8]==0)
{
err[8]=1;
con++;
tur[i-con]=9;
}
if(buf==10 && err[9]==0)
{
err[9]=1;
con++;
tur[i-con]=10;
}
if(buf==1 && err[10]==0)
{
err[10]=1;
con++;
tur[i-con]=11;
}
}
for(int i=0;i<=7;i++)
{
cout<<tur[i]<<" ";
}
return;
}
questa è una delle tante prove che nn funzionano...

Torav
10-07-2009, 18:50
scusa ma se vuoi avere un array contenente n numeri (consecutivi!) messi in posizioni casuali non ti conviene riempire l'array con (ad esempio) i numeri da 1 a n e poi cambiar loro di posto in maniera casuale?
Se invece vuoi avere un array di n numeri presi in maniera casuale da un insieme molto più grande devi utilizzare altri metodi

tizioquick
10-07-2009, 19:06
mh...non ci avevo pensato. grazie.

Matita48
10-07-2009, 20:16
Ciao a tutti sono nuovo del forum.
Per rispondere alla tua domanda innanzitutto bisognerebbe sapere qual' è la dimensione dell'array(ordine di grandezza,10,100,1000)...
Potresti fare un algoritmo del genere:
1) Un primo ciclo for in cui riempi un array con dei numeri consecutivi... facciamo da 1 a 100.
2)Un altro ciclo for all'indietro in cui calcoli un valore random del tipo rand()%i e vai ad assegnare all'indice crescente del nuovo array il valore del primo array in corrispondenza dell'indice calcolato.
In questo modo calcoli in modo random l'indice dell'elemento del primo array

Pseudo codice (è molto che non programmo in c++)
int i;
int j;
int dimensione = 100;
int [] _primoarray = new int[100];
int [] _arraycasuale = new int[100];
for(i=0;i<dimensione;i++)
{
_primoarray[i]=i;//oppure i+1 se vai da 1 a 100 invece che da 0 a 99
}

//secondo ciclo
for(j=dimensione;j>-1;j--)
{
int index = rand()%j;
_arraycasuale[dimensione-j]= _primoarray[index];

}


Non l'ho provato era per darti un'idea bisognerebbe controllare se i bound degli indici sono corretti.
In questo modo qualsiasi sia la dimensione fai due cicli for, con una complessità dell'algoritmo O(n), dove n è la dimensione dell'array

tizioquick
11-07-2009, 01:47
...ho risolto creando un array di numeri consequenziali per poi cambiargli l'ordine casualmente.
ecco il codice:
int tur[10],n,a,b=0;
for(int i=0;i<10;i++)
{
tur[i]=i+1;
}
for(int i=0;i<10;i++)
{
a=(rand()%9)+1;//qui avviene lo scambio in maniera casuale delle
b=tur[a]; //locazioni dell'array
tur[a]=tur[i];
tur[i]=b;
}

funziona bene per le prove che ho fatto e mi sembra molto meglio di come avevo pensato all'inizio.