|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jul 2009
Messaggi: 8
|
[c++]creazione array di numeri random senza che essi si ripetino
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... |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
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 |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jul 2009
Messaggi: 8
|
mh...non ci avevo pensato. grazie.
|
![]() |
![]() |
![]() |
#4 |
Junior Member
Iscritto dal: Jul 2009
Messaggi: 2
|
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 Ultima modifica di Matita48 : 10-07-2009 alle 20:19. Motivo: Modifica per completare |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jul 2009
Messaggi: 8
|
...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. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:39.