PDA

Visualizza la versione completa : [C] Simulazione estrazioni del lotto


cristianc
19-07-2009, 10:33
Ciao,
volevo trovare una procedura per fare in modo di estrarre numeri casuali su una data ruota della lotteria.

Per ogni ruota vengono estratti cinque numeri. In pratica devo generare dei numeri casuali, e all'estrazione del numero successivo ovviamente non può uscire il numero precedente dato che è già uscito nell'estrazione precedente. Purtroppo però non so da dove partire.

Qui la mia prima bozza di codice:


#include <stdio.h>

main()
{
int i;
char *estr[]={"prima","seconda","terza","quarta","quinta","sesta","settima","ottava","nona","decima"};
printf("\n\t\t\t* ESTRAZIONI DEL LOTTO *\n\n");
for(i=0;i<10;i++) {
printf("%s estrazione:\n\n",estr[i]);

}
}

oregon
19-07-2009, 12:31
Comincia ad estrarre un numero per una ruota.

Confronta il numero uscito con tutti quelli gia' usciti per quella ruota; se e' gia' uscito, estraine un altro.

Continua fino a che hai estratto 5 valori diversi.

Ripeti le 3 fasi precedenti per ogni ruota.

cristianc
19-07-2009, 15:04
Grazie. :zizi:

Però si è presentato un problema: cioè usare la funzione per estrarre il numero.
Ho cercato di documentarmi, ma sembra che la funzione rand non sia proprio buona, nel senso che ha qualche problema.
Mi chiedevo se voi ne conoscete qualcuna di migliore :)

MItaly
19-07-2009, 15:17
Originariamente inviato da cristianc
Ho cercato di documentarmi, ma sembra che la funzione rand non sia proprio buona, nel senso che ha qualche problema.

Che problema dovrebbe avere? Per i tuoi scopi va più che bene. Ricordati solo di inizializzare il generatore di numeri casuali prima di richiamare la rand() utilizzando


srand(time(NULL));
(per la funzione time dovrai includere time.h).

oregon
19-07-2009, 16:27
Originariamente inviato da cristianc
Ho cercato di documentarmi, ma sembra che la funzione rand non sia proprio buona, nel senso che ha qualche problema.

Se ti sei documentato, non dire "sembra che" , "ha qualche problema" ... ma dici esattamente qual e' il problema e dove hai letto che esiste questo problema ...

Da quando "conosco" la rand non mi ha dato mai nessun problema ... :-)


Mi chiedevo se voi ne conoscete qualcuna di migliore :)

"Migliore" ... in cosa? :madai!?:

cristianc
17-08-2009, 19:44
quindi va utilizzato questo?

srand(time(NULL));
i = rand() % 90 + 1;


"Migliore" ... in cosa?
per migliore intendo più efficiente :D

MItaly
18-08-2009, 11:21
Originariamente inviato da cristianc
quindi va utilizzato questo?

srand(time(NULL));
i = rand() % 90 + 1;

Sì, ma la prima riga va richiamata solo una volta all'inizio del programma.


per migliore intendo più efficiente :D
Hai riscontrato problemi di efficienza nella rand()? :madai!?:

cristianc
19-08-2009, 10:43
Ho realizzato una primissima versione del programma. Ecco il codice:

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

main()
{
int estr;
int num[10][11][5];
char *ordine[] = {"prima","seconda","terza","quarta","quinta","sesta","settima","ottava","nona","decima"};
char *citta[] = {"BARI","CAGLIARI","FIRENZE","GENOVA","MILANO","NAPOLI","PALERMO","ROMA","TORINO","VENEZIA","NAZIONALE"};
srand(time(NULL));
printf("\n\t\t\t* ESTRAZIONI DEL LOTTO *\n\n");
for(estr=0;estr<10;estr++) {
int ruota;
printf("%s estrazione:\n\n",ordine[estr]);
for(ruota=0;ruota<11;ruota++) {
int i,j;
printf("%s\t",citta[ruota]);
for(i=0;i<5;i++) {
num[estr][ruota][i] = rand() % 90 + 1;
for(j=0; j<i; j++)
if (num[estr][ruota][i] == num[estr][ruota][j]) {
j=i;
i--;
}
printf("%d ",num[estr][ruota][i]);
}
printf("\n\n");
}
}
printf("\n\n");
}

Ed ecco il suo output:

* ESTRAZIONI DEL LOTTO *

prima estrazione:

BARI 12 10 74 15 38

CAGLIARI 56 50 16 31 81

FIRENZE 31 84 21 82 73

GENOVA 15 1 2 75 89

MILANO 35 63 82 12 64

NAPOLI 86 11 77 79 15

PALERMO 29 1 25 64 67

ROMA 24 81 79 39 21

TORINO 31 31 15 52 23 87

VENEZIA 66 75 50 51 35

NAZIONALE 85 75 26 58 10

seconda estrazione:

BARI 21 68 87 62 82

CAGLIARI 77 24 68 12 52

FIRENZE 1 2 40 40 74 71

GENOVA 32 88 84 16 46

MILANO 59 90 6 71 35

NAPOLI 52 18 22 19 27

PALERMO 5 48 75 66 39

ROMA 23 51 69 34 12

TORINO 69 87 52 70 71

VENEZIA 84 64 68 77 79

NAZIONALE 76 7 41 43 40

terza estrazione:

BARI 75 4 57 58 74

CAGLIARI 45 62 31 30 89

FIRENZE 31 52 49 9 48

GENOVA 61 78 44 74 57

MILANO 24 67 30 54 15

NAPOLI 71 39 21 21 81 22

PALERMO 57 46 78 24 29

ROMA 33 48 59 24 46

TORINO 89 37 57 60 84

VENEZIA 79 47 90 24 65

NAZIONALE 23 90 57 76 66

quarta estrazione:

BARI 37 76 48 19 28

CAGLIARI 70 37 73 19 22

FIRENZE 63 51 69 83 36

GENOVA 77 44 73 5 13

MILANO 28 83 21 27 16

NAPOLI 85 12 67 13 49

PALERMO 4 11 87 51 29

ROMA 24 30 27 59 49

TORINO 49 83 61 79 76

VENEZIA 59 27 29 3 31

NAZIONALE 3 30 75 23 19

quinta estrazione:

BARI 90 69 82 28 28 40

CAGLIARI 31 54 88 44 45

FIRENZE 22 73 71 42 83

GENOVA 29 34 16 70 19

MILANO 74 6 9 76 37

NAPOLI 63 67 21 85 85 73

PALERMO 26 38 62 69 40

ROMA 55 32 37 8 76

TORINO 58 42 57 9 87

VENEZIA 47 5 12 26 23

NAZIONALE 85 32 84 84 30 56

sesta estrazione:

BARI 8 50 13 55 84

CAGLIARI 38 2 56 68 3

FIRENZE 72 9 40 79 85

GENOVA 7 82 51 68 78

MILANO 7 72 89 85 56

NAPOLI 45 26 49 38 55

PALERMO 67 46 66 41 62

ROMA 60 40 25 77 17

TORINO 28 58 25 67 8

VENEZIA 19 35 89 31 12

NAZIONALE 39 90 45 37 84

settima estrazione:

BARI 11 44 71 21 81

CAGLIARI 87 87 88 62 89 21

FIRENZE 83 38 8 31 54

GENOVA 35 50 79 63 57

MILANO 59 7 18 90 71

NAPOLI 56 89 77 54 44

PALERMO 87 59 24 70 50

ROMA 20 28 9 43 27

TORINO 30 36 64 89 28

VENEZIA 80 33 78 68 57

NAZIONALE 44 36 25 23 87

ottava estrazione:

BARI 5 78 85 44 4

CAGLIARI 90 2 62 23 71

FIRENZE 73 4 61 44 47

GENOVA 87 35 44 22 33

MILANO 71 11 65 58 40

NAPOLI 83 64 38 17 86

PALERMO 34 74 36 81 27

ROMA 39 80 28 62 13

TORINO 61 45 68 31 50

VENEZIA 24 27 84 67 10

NAZIONALE 26 10 21 52 67

nona estrazione:

BARI 60 44 40 59 59 88

CAGLIARI 3 5 33 83 31

FIRENZE 33 72 21 4 46

GENOVA 81 10 24 21 59

MILANO 9 9 52 38 18 77

NAPOLI 47 90 90 23 22 43

PALERMO 25 80 65 74 82

ROMA 69 16 36 62 48

TORINO 70 82 51 77 34

VENEZIA 61 62 54 29 71

NAZIONALE 24 43 18 41 81

decima estrazione:

BARI 64 3 81 48 24

CAGLIARI 85 34 65 21 17

FIRENZE 57 90 32 54 23

GENOVA 41 33 66 2 72

MILANO 9 24 43 62 14

NAPOLI 23 85 56 40 87

PALERMO 47 65 89 89 23 74

ROMA 83 56 49 14 73

TORINO 67 65 66 30 49

VENEZIA 17 25 24 70 6

NAZIONALE 32 3 48 55 68


Ovviamente ho fatto scrivere il numero anche se è ripetuto (ma va corretto) e devo migliorare la formattazione per l'allineamento.

Volevo chiedervi: con l'istruzione che ho usato viene escluso lo 0?
E poi: ho notato facendo alcune esecuzioni del programma che si verificano diverse volte ripetizioni di numeri.


Sì, ma la prima riga va richiamata solo una volta all'inizio del programma.
si, ma siamo sicuri che la srand vada chiamata una sola volta nel programma o che invece la devo richiamare ogni 5 numeri (cioè quando cambio la ruota)?


Hai riscontrato problemi di efficienza nella rand()?
per cercare di documentarmi avevo fatto una ricerca in internet e alcuni risultati davano questa impressione. Ma se questa funzione genera davvero numeri «casuali» allora va bene. L'importante è che funzioni bene :) Come velocità di calcolo sembra buona :D

cristianc
30-08-2009, 18:56
Ho eliminato la ripetizione del numero ed ho migliorato un po' la formattazione:

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

main()
{
int estr;
int num[10][11][5];
char *ordine[] = {"prima","seconda","terza","quarta","quinta","sesta","settima","ottava","nona","decima"};
char *citta[] = {"BARI","CAGLIARI","FIRENZE","GENOVA","MILANO","NAPOLI","PALERMO","ROMA","TORINO","VENEZIA","NAZIONALE"};
srand(time(NULL));
printf("\n\t\t\t* ESTRAZIONI DEL LOTTO *\n\n");
for(estr=0;estr<10;estr++) {
int ruota;
printf("%s estrazione:\n\n",ordine[estr]);
for(ruota=0;ruota<11;ruota++) {
int i,j;
printf("%-25s",citta[ruota]);
for(i=0;i<5;i++) {
num[estr][ruota][i] = rand() % 90 + 1;
for(j=0; j<i; j++) {
if (num[estr][ruota][i] == num[estr][ruota][j]) {
j=i;
i--;
}
else {
printf("%d ",num[estr][ruota][i]);
j=i;
}
}
}
printf("\n\n");
}
}
printf("\n\n");
}

E questo è l'output:


* ESTRAZIONI DEL LOTTO *

prima estrazione:

BARI 36 28 52 24

CAGLIARI 59 20 16 32

FIRENZE 15 19 83 82

GENOVA 18 52 72 7

MILANO 88 53 75 6

NAPOLI 3 73 88 46

PALERMO 85 73 65 70

ROMA 33 89 35 26

TORINO 12 44 11 70

VENEZIA 15 49 87 48

NAZIONALE 10 46 69 47

seconda estrazione:

BARI 30 49 85 79

CAGLIARI 8 35 38 34

FIRENZE 57 66 64 53

GENOVA 83 64 6 3

MILANO 40 69 53 88

NAPOLI 69 60 34 47

PALERMO 46 77 26 3

ROMA 29 10 62 28

TORINO 37 46 70 11

VENEZIA 84 3 86 89

NAZIONALE 90 90 88 15

terza estrazione:

BARI 24 45 57 19

CAGLIARI 34 64 40 59

FIRENZE 66 49 89 89

GENOVA 3 36 83 72

MILANO 52 27 10 47

NAPOLI 66 9 63 75

PALERMO 48 29 2 28

ROMA 87 2 31 55

TORINO 7 65 80 5

VENEZIA 82 40 4 26

NAZIONALE 17 52 56 64

quarta estrazione:

BARI 32 72 63 56

CAGLIARI 46 66 46 9

FIRENZE 76 5 56 16

GENOVA 47 74 85 36

MILANO 6 27 42 61

NAPOLI 89 77 14 54

PALERMO 52 47 45 24

ROMA 62 31 2 18

TORINO 56 3 5 22

VENEZIA 25 30 16 19

NAZIONALE 56 76 53 59

quinta estrazione:

BARI 15 57 84 80

CAGLIARI 6 41 81 50

FIRENZE 17 22 56 18

GENOVA 56 74 3 60

MILANO 34 84 86 49

NAPOLI 60 66 11 22

PALERMO 18 88 53 63

ROMA 35 68 79 78

TORINO 14 4 63 69

VENEZIA 63 34 19 65

NAZIONALE 75 60 48 32

sesta estrazione:

BARI 73 53 46 83

CAGLIARI 42 10 34 5

FIRENZE 72 1 12 23

GENOVA 53 36 44 25

MILANO 27 87 62 7

NAPOLI 27 43 45 36

PALERMO 25 19 36 32

ROMA 71 74 35 66

TORINO 69 10 80 32

VENEZIA 5 29 33 29

NAZIONALE 21 78 29 79

settima estrazione:

BARI 17 31 16 52

CAGLIARI 2 32 11 34

FIRENZE 43 69 39 71

GENOVA 17 42 57 58

MILANO 46 62 63 40

NAPOLI 82 22 2 72

PALERMO 63 88 40 41

ROMA 15 4 5 77

TORINO 61 30 15 9

VENEZIA 32 77 51 51

NAZIONALE 85 58 30 19

ottava estrazione:

BARI 82 10 81 83

CAGLIARI 1 17 40 2

FIRENZE 13 69 23 17

GENOVA 59 77 84 36

MILANO 55 29 85 67

NAPOLI 90 23 47 29

PALERMO 16 72 13 58

ROMA 56 58 43 57

TORINO 61 69 90 45

VENEZIA 16 14 85 10

NAZIONALE 41 26 39 35

nona estrazione:

BARI 80 87 77 88

CAGLIARI 80 13 59 55

FIRENZE 72 52 36 38

GENOVA 59 69 34 13

MILANO 49 78 20 20

NAPOLI 22 46 89 19

PALERMO 78 15 48 75

ROMA 90 49 59 54

TORINO 53 87 3 50

VENEZIA 75 18 64 70

NAZIONALE 89 29 70 70

decima estrazione:

BARI 68 53 17 28

CAGLIARI 78 67 47 36

FIRENZE 10 87 61 68

GENOVA 82 8 67 42

MILANO 51 21 67 83

NAPOLI 27 73 31 58

PALERMO 60 20 9 87

ROMA 86 63 9 83

TORINO 18 79 7 48

VENEZIA 70 1 59 8

NAZIONALE 62 21 63 90





Non riesco però a capire come mai ci sono 4 numeri invece di 5 :confused:

Ho sempre dubbi sullo 0 e sul fatto di dover chiamare la srand una sola volta nel programma :D

Ippo343
31-08-2009, 00:05
Ora come ora non ho visto il perchè dei soli 4 numeri... adesso ho troppo sonno per ragionarci, ci provo domani.

rand() è (se non sbaglio :S) un Linear Congruential Generator. Cercatelo su wikipedia: cmq il succo del discorso è che

1) su un computer non puoi mai avere numeri casuali, al massimo pseudocasuali
2) un LCG ha bisogno di un "seed", ovvero di un numero da cui iniziare la sequenza. La chiamata a srand imposta il seed di rand usando l'orologio di sistema. Perciò basta chiamarlo una volta sola in tutto il programma.

Loading