PDA

View Full Version : ..genero 2 numeri casuali in rand poi per copiarli l'uno sull'altro come faccio???


Piojolopez2406
16-01-2007, 12:31
ragazzi ho da fare questo tipo di esercizio...dato un mazzetto di carte napoletane ordinato generare 1 coppia di carte e scambiarle l'una con l'altra....

ho creato uan struct carta:

struct carta
{
int valore;
char seme[8];
};

//definizione mazzetto ordinato
struct carta mazzetto[]={
{1,"bastoni"},{2,"bastoni"},{3,"bastoni"},{4,"bastoni"},{5,"bastoni"},
{6,"bastoni"},{7,"bastoni"},{8,"bastoni"},{9,"bastoni"},{10,"bastoni"},
{1,"coppe"},{2,"coppe"},{3,"coppe"},{4,"coppe"},{5,"coppe"},
{6,"coppe"},{7,"coppe"},{8,"coppe"},{9,"coppe"},{10,"coppe"},
{1,"denari"},{2,"denari"},{3,"denari"},{4,"denari"},{5,"denari"},
{6,"denari"},{7,"denari"},{8,"denari"},{9,"denari"},{10,"denari"},
{1,"spade"},{2,"spade"},{3,"spade"},{4,"spade"},{5,"spade"},
{6,"spade"},{7,"spade"},{8,"spade"},{9,"spade"},{10,"spade"};}

ho estratto con la rand 2 carte casuali:

//generazione due carte a caso
for (i=1;i<=2;i++)

{
nc=rand()%41;
}
ora ho necessità di copiare nella posizione della prima carta la seconda e viceversa....insomma vojo stampare il mazzetto non più in modo ordinato ma con il cambio delle 2 carte generate a caso.... come posso fare???

andbin
16-01-2007, 12:50
ora ho necessità di copiare nella posizione della prima carta la seconda e viceversaint idx1, idx2;
struct carta tmp;

srand ((unsigned int) time (NULL));

idx1 = rand () % 40;
idx2 = rand () % 40;

tmp = mazzetto[idx1];
mazzetto[idx1] = mazzetto[idx2];
mazzetto[idx2] = tmp;
Nota che:
a) Visto che hai 40 carte, gli indici vanno da 0 a 39 (per quello % 40 e non % 41).
b) Alla fine dell'array devi mettere ....{10,"spade"}};
c) L'operazione di modulo sul valore di rand() non offre una ottima pseudo-casualità (leggi <qui> (http://www.hwupgrade.it/forum/showthread.php?t=1196677)).

leox@mitoalfaromeo
16-01-2007, 12:50
ti memorizzi i 2 "indici" delle carte da scambiare.
copi mazzetto[primoindice] in una temporanea.
incolli mazzetto[secondoindice] in mazzetto[primoindice] e incolli la temporanea in mazzetto[secondoindice]...

sono un cane nella sintassi del c/c++ ma... quando dichiari il mazzetto mi sembra che tu non debba mettere struct in quanto "carta" è già un """""tipo di dato"""" caratterizzato dalla struttura

Piojolopez2406
17-01-2007, 11:02
ti memorizzi i 2 "indici" delle carte da scambiare.
copi mazzetto[primoindice] in una temporanea.
incolli mazzetto[secondoindice] in mazzetto[primoindice] e incolli la temporanea in mazzetto[secondoindice]...

sono un cane nella sintassi del c/c++ ma... quando dichiari il mazzetto mi sembra che tu non debba mettere struct in quanto "carta" è già un """""tipo di dato"""" caratterizzato dalla struttura


cioè tu dici così???

nc=rand()%40;
nc1=rand()%40;
swap=mazzetto[nc];
mazzetto[nc]=mazzetto[nc1];
mazzetto[nc1]=swap;

mi da un incompatibilità di types (swap=mazzetto[nc];)...io swap l'ho dikiarato int...coem devo fare per eliminare questo errore??

Piojolopez2406
17-01-2007, 11:06
int idx1, idx2;
struct carta tmp;

srand ((unsigned int) time (NULL));

idx1 = rand () % 40;
idx2 = rand () % 40;

tmp = mazzetto[idx1];
mazzetto[idx1] = mazzetto[idx2];
mazzetto[idx2] = tmp;
Nota che:
a) Visto che hai 40 carte, gli indici vanno da 0 a 39 (per quello % 40 e non % 41).
b) Alla fine dell'array devi mettere ....{10,"spade"}};
c) L'operazione di modulo sul valore di rand() non offre una ottima pseudo-casualità (leggi <qui> (http://www.hwupgrade.it/forum/showthread.php?t=1196677)).



a parte questi errori....che già avev notato io...così com ho impostato io lo struct non va bene??? nn riesco a salvare in una variabile d'appoggio(swap)
"mazzetto[nc]" perkè mi da incompatibilità di type...coem devo impostare swap?int??

andbin
17-01-2007, 11:07
io swap l'ho dikiarato int...coem devo fare per eliminare questo errore??Leggere il mio esempio sopra?? ;)

Piojolopez2406
17-01-2007, 11:09
Leggere il mio esempio sopra?? ;)
ti kiedevo se l'unico modo era fare come hai fatto tu o cmq anke come ho fatto io ma con le ddovute correzioni..ecco tutto...ti ripeto ho solo un probl per la variabile d'appoggio...

andbin
17-01-2007, 11:21
ho solo un probl per la variabile d'appoggio...La variabile di appoggio la devi per forza dichiarare di tipo struct carta (se vuoi spostare l'intera struttura ... nulla ti vieta di spostare i singoli campi in qualunque altro modo).

Piojolopez2406
17-01-2007, 12:32
La variabile di appoggio la devi per forza dichiarare di tipo struct carta (se vuoi spostare l'intera struttura ... nulla ti vieta di spostare i singoli campi in qualunque altro modo).
grazie ...risolto questo problema...

ora vedo ke capita anke ke mi generi casualmente 2 carte uguali...come poso evitare ke succeda questo???con un if???

bhe ora...dato ke devo stampare il mazzo di carte miskiato...(io prima tramite ciclo for ho impostato il numero di miskiate ke vojo fare...ad ogni miskiata ovviamente corrisponde lo scambio di 2 carte...)....come faccio???

andbin
17-01-2007, 12:48
ora vedo ke capita anke ke mi generi casualmente 2 carte uguali...come poso evitare ke succeda questo???con un if???

bhe ora...dato ke devo stampare il mazzo di carte miskiato...(io prima tramite ciclo for ho impostato il numero di miskiate ke vojo fare...ad ogni miskiata ovviamente corrisponde lo scambio di 2 carte...)....come faccio???La soluzione più semplice (che non è il massimo ...) è la seguente:
idx1 = rand () % 40;
do {
idx2 = rand () % 40;
} while (idx2 == idx1);In pratica si ripete la generazione del secondo numero se è uguale al primo.

Piojolopez2406
17-01-2007, 12:53
La soluzione più semplice (che non è il massimo ...) è la seguente:
idx1 = rand () % 40;
do {
idx2 = rand () % 40;
} while (idx2 == idx1);In pratica si ripete la generazione del secondo numero se è uguale al primo.
ho risolto con un semplice if...
{
nc=rand()%40;
nc1=rand()%40;
if (nc!=nc1)
{...qui poi faccio l'operazione di swap}

ora ovviamente devo stampare il mazzetto miskiato.....tramite for immagino...ma come???

p.s. in ogni caso grzie per la gentile cortesia e l'attenzione ke mi stai dedicando...

andbin
17-01-2007, 13:10
Un'altra soluzione per mischiare le carte e non avere problemi di indici doppi, è la seguente (mi baso sulla tua struttura del mazzo):
....

int rand_int (int min, int max)
{
double d;

d = rand () / (RAND_MAX+1.0);
return ((int) (d * (max-min+1))) + min;
}

...

int i, idx1, idx2;
struct carta tmp;

srand ((unsigned int) time (NULL));

for (i = 0; i < 39; i++)
{
idx1 = i;
idx2 = rand_int (i+1, 39);

tmp = mazzetto[idx1];
mazzetto[idx1] = mazzetto[idx2];
mazzetto[idx2] = tmp;
}rand_int è una funzioncina che ho fatto io (che uso sempre in questi casi) e che permette sia di estrarre un valore entro certi limiti (compresi) specifici, sia di ottenere una ottima pseudo-casualità.

L'algoritmo di mescolamento è semplice: la prima carta la scambio con una delle altre 39, la seconda la scambio con una delle altre 38, e così via.
In questo modo nessuna carta sarà più al suo "posto" originale.

andbin
17-01-2007, 13:31
ora ovviamente devo stampare il mazzetto miskiato.....tramite for immagino...ma come???Con un semplice for:
for (i = 0; i < 40; i++)
{
printf ("%d di %s\n", mazzetto[i].valore, mazzetto[i].seme);
}

Piojolopez2406
17-01-2007, 14:38
ho finito il programma....
permettimi di correggerti ma nel for di cui sopra i parametri il parametro ke cvaria non è "i", ma "nc",quindi for(nc=0;nc<40;nc++) e ovviamente la printf mi dovrà scrivere questi 2 valori...mazzetto[nc].valore,mazzetto[nc].seme tutto nel ciclo for così da generarmi il mazzetto miskiato...
di seguito metterò tutto il programma, così se a qyualcuno in futuro potrà serivire lo trova qui...


#include<stdio.h>
#include<stdlib.h>
#include <time.h>

int main()
{
int j,n,nc,nc1,i;

struct carta //crea una struct di tipo carta
{
int valore;
char seme[8];
};
struct carta swap;/* di tipo carta riferita alla variabile swap (N.B. se la var. swap la si inizializzasse di tipo intovviamente questa genererebbe un errore durante l'assegnazione dello swap nella riga 43 perche le 2 variabili a quel punto risulterebbero di diverso tipo*/
//definizione mazzetto ordinato
struct carta mazzetto[]={
{1,"bastoni"},{2,"bastoni"},{3,"bastoni"},{4,"bastoni"},{5,"bastoni"},
{6,"bastoni"},{7,"bastoni"},{8,"bastoni"},{9,"bastoni"},{10,"bastoni"},
{1,"coppe"},{2,"coppe"},{3,"coppe"},{4,"coppe"},{5,"coppe"},
{6,"coppe"},{7,"coppe"},{8,"coppe"},{9,"coppe"},{10,"coppe"},
{1,"denari"},{2,"denari"},{3,"denari"},{4,"denari"},{5,"denari"},
{6,"denari"},{7,"denari"},{8,"denari"},{9,"denari"},{10,"denari"},
{1,"spade"},{2,"spade"},{3,"spade"},{4,"spade"},{5,"spade"},
{6,"spade"},{7,"spade"},{8,"spade"},{9,"spade"},{10,"spade"}
};
//stampa mazzetto ordinato
for (i=0;i<40;i++)
{printf ("%d di %s\n",mazzetto[i].valore,mazzetto[i].seme);};
//immettere il numero di smazzate che si vuole fare
printf("\nscrivere quante smazzate si vogliono fare: ");
scanf("%d",&n);
printf("\n");
//la srand ci genererà parametri casuali tramite la funzione rand sempre diversi, esa è legata all'orario
srand(time(NULL));
//ciclo for che effettua il numero di smazzate (N.B. ad una smazzata corrisponde uno scambio tra 2 carte)
for (j=0;j<=n-1;j++)
{
nc=rand()%40;//generazione primo numero casuale
nc1=rand()%40;//generazione secondo numero casuale
//costrutto if che farà in modo danon generare due indici casuali uguali
if (nc!=nc1)
{ //effettua lo scambio usando una variabile d'appoggio swap
swap=mazzetto[nc];
mazzetto[nc]=mazzetto[nc1];
mazzetto[nc1]=swap;
//stampa scambi avvenuti
printf("gli scambi avvenuti sono: %d di %s con %d di %s\n",
mazzetto[nc].valore,mazzetto[nc].seme,mazzetto[nc1].valore,mazzetto[nc1].seme);
}
}
printf("\n\nil mazzetto dopo aver effettuato %d smazzate e':\n\n",n);
//ciclo for che mi stamperà il mazzetto di 40 carte dopo aver effettuato un numero da noi deciso di smazzate
for (nc=0;nc<40;nc++)
printf("%d di %s\n",mazzetto[nc].valore,mazzetto[nc].seme);
}

andbin
17-01-2007, 15:09
permettimi di correggerti ma nel for di cui sopra i parametri il parametro ke cvaria non è "i", ma "nc",quindi for(nc=0;nc<40;nc++)E cosa cambia??? :eh:
Io ho fatto solo degli esempi di codice .... poi le variabil chiamale come ti pare.

di seguito metterò tutto il programma, così se a qyualcuno in futuro potrà serivire lo trova qui...Allora inizia a postare il codice dentro il tag CODE, a scrivere il codice in modo chiaro e ben indentato (4 spazi per la indentazione), a mettere /* */ invece di //, a mettere il return alla fine del main.

cionci
17-01-2007, 19:36
Oppure ti estrai gli indici da scambiare in questo modo:

idx1 = rand() % 40;
idx2 = rand() % 39;

if(idx2 >= idx1) idx2++;

In questo modo i due indici non saranno mai uguali...