View Full Version : [Linguaggio C]Numeri diversi
Buongiorno a tutti!
Dopo i vari dubbi che ho avuto (e risolto) sulla programmazione ad oggetti, ooggi mi ritrovo con un problema che non riesco a risolvere in un piccolo programma che stò cercando di creare con il linguaggio C.
Il file in questione è questo:
Piccolo programma creato da me (https://docs.google.com/file/d/0B89Z0GcShEieSXJkSG0xbW1iRTg/edit)
So che puo' sembrare una sciocchezza, ma ad un certo punto nel codice, quando vado a rendere casuali i numeri, non riesco a non fare uscire due numeri uguali, mi spiego meglio
Escono i numeri: 1 3 1 17 5 3 5
Vorrei invece che l'output fosse: 1 3 17 5
Qualche spunto per riuscire a risolvere questo piccolo difetto?
P.S.: Sì lo so che non è solo questo il problema, ma ancora è in fase di "sviluppo" :D
Grazie della vostra attenzione! :)
sottovento
19-06-2014, 12:18
Sbaglio o hai postato l' eseguibile del tuo programma?
Hai paura che non crediamo a quanto hai scritto? :D
Dai su, scherzo. Pero' non va pubblicato l'eseguibile, visto che non ci conosciamo dobbiamo credere sulla parola che faccia quello che hai detto. Invece magari e' un bel virus o peggio. E poi non possiamo aiutarti, no? Non e' di alcuna utilita'!
Metti il sorgente, e' piu' divertente. ciau
Mi hanno sempre suggerito di non postare mai il sorgente... ora lo posto :D :D
#include<stdio.h>
#include<stdlib.h>
int i,ncaratteri;
FILE *testo;
FILE *random;
void leggi_file()
{
char stringa[100][ncaratteri]; int k=1;
testo=fopen("lista.txt","r");
random=fopen("random_lista.txt","w");
printf("******INIZIO******\n\n");
if(testo!=(NULL))
{
for(i=0;i<ncaratteri;i++)
{
fflush(stdin);
fgets(stringa[i],sizeof(stringa),testo);
printf("%d) %s",k,stringa[i]); k++;
}
}
else
printf("Impossibile aprire il file!\n");
printf("\n\nLista generata:\n\n");
for(i=0;i<ncaratteri;i++)
{
k = rand() % ncaratteri;
printf("%d %s",k,stringa[k]);
fprintf(random, "%d - %s\n",ncaratteri, stringa[k]);
}
printf("\n\a********FINE*******\n\n");
}
void scrivirandom_file()
{
char stringa[200][ncaratteri];
for(i=0;i<ncaratteri;i++)
fprintf(random, "%s", stringa[i]);
}
Ho postato solo le procedure più importanti che sul resto non ho dubbi.
Attendo risposte :)
pabloski
19-06-2014, 14:38
Difetti non ce ne sono. I numeri casuali funzionano così.
Quindi o ti segni quali numeri sono già usciti e scarti eventualmente quelli che sono doppioni, oppure generi un vettore con un pool di numeri, poi estrai un elemento dal vettore da una posizione casuale.
Difetti non ce ne sono. I numeri casuali funzionano così.
Quindi o ti segni quali numeri sono già usciti e scarti eventualmente quelli che sono doppioni
Avevo deciso di provare così ma il problema è come fare!
pabloski
19-06-2014, 17:20
Avevo deciso di provare così ma il problema è come fare!
Caso 1:
ogni numero estratto viene aggiunto ad un vettore...prima di aggiungerlo fai una ricerca nel vettore, per vedere se c'è già....puoi mantenere il vettore ordinato per accelerare la ricerca
Caso 2:
crei un vettore di dimensione N, dove in ogni posizione N c'è il numero N...estrai un numero tra 0 e N-1, controlli se v[rand()] == 0 allora il numero in quella posizione è stato già selezionato e quindi devi estrarre un nuovo numero casuale....altrimenti v[rand()] è il numero scelto e poni v[rand()]=0
Caso 1:
ogni numero estratto viene aggiunto ad un vettore...prima di aggiungerlo fai una ricerca nel vettore, per vedere se c'è già....puoi mantenere il vettore ordinato per accelerare la ricerca
Ok! Mi sono ricordato come risolvere il problema grazie ad un algoritmo che avevo già fatto in precedenza.
La discussione si può chiudere ora devo solo scrivere il codice.
Grazie a tutti!
Daniels118
23-06-2014, 14:12
Caso 1:
ogni numero estratto viene aggiunto ad un vettore...prima di aggiungerlo fai una ricerca nel vettore, per vedere se c'è già....puoi mantenere il vettore ordinato per accelerare la ricerca
Caso 2:
crei un vettore di dimensione N, dove in ogni posizione N c'è il numero N...estrai un numero tra 0 e N-1, controlli se v[rand()] == 0 allora il numero in quella posizione è stato già selezionato e quindi devi estrarre un nuovo numero casuale....altrimenti v[rand()] è il numero scelto e poni v[rand()]=0
So che l'hai scritto solo per spiegare il procedimento, ma è bene precisare che il valore ottenuto da rand() va inserito in una variabile d'appoggio prima di essere utilizzato come indice, altrimenti vai a scrivere zero su una posizione diversa da quella che avevi scelto.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.