/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E P A Q U E T S D E N O M B R E S A L E A T O I R E S E N T I E R S : */ /* */ /* */ /* Utilisation : */ /* */ /* $aPout [<NIterations> [<Graine> [<PasGraine> [<Tabule>]]]] */ /* */ /* */ /* Principe : */ /* */ /* Ce programme genere iterativement des */ /* paquets de N bits aleatoires de la facon */ /* suivante : */ /* */ /* ITERATION 1 1 paquet {N1(0),N1(1)} */ /* ITERATION 2 1xN1(1) paquets identiques {N2(0),N2(1)} */ /* ITERATION 3 1xN1(1)xN2(1) paquets identiques {N3(0),N3(1)} */ /* ITERATION 4 1xN1(1)xN2(1)xN3(1) paquets identiques {N4(0),N4(1)} */ /* (...) */ /* */ /* avec : */ /* */ /* Ni(0)+Ni(1) = N \-/ i */ /* */ /* 'Ni(0)' et 'Ni(1)' designant respectivement les */ /* nombres de '0's et de '1's a l'iteration 'i'... */ /* */ /* On notera que la graine du generateur aleatoire */ /* peut changer a chaque iteration et ce en faisant */ /* que 'PasGraine' soit different de 0. Par contre */ /* si ce pas est nul, alors TOUS les paquets sont */ /* identiques (quelle que soit l'iteration...). */ /* */ /* */ /* Author of '$xtc/random_paquets.01$vv$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20240914094257). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" extern int atoi(); extern double drand48(); extern double floor(); #define ITERATION 6 #define N (3*3*3) /* En prevision d'une utilisation pour l'eponge de Menger... */ #define MinN (1+10) #define MaxN (N-10) #define GRAINE 1789 #define PASGRAINE 1 #define TABULE FAUX void main(int argc,char *argv[]) { int iteration,NIterations=ITERATION; long int Graine=GRAINE,PasGraine=PASGRAINE; int Tabule=TABULE; int npaquets=1; if (argc >= 2) { NIterations=atoi(argv[1]); if (argc >= 3) { Graine=atoi(argv[2]); if (argc >= 4) { PasGraine=atoi(argv[3]); if (argc >= 5) { Tabule=atoi(argv[4]); if (argc >= 6) { printf("Les arguments en sur-nombre sont ignores.\n"); } else { } } else { } } else { } } else { } } else { } for (iteration=1 ; iteration<=NIterations ; iteration++) { double rdn=drand48(); int n0,n1; int generer=VRAI; srand48(Graine); rdn = (MaxN-MinN+1)*rdn; rdn = rdn+MinN; rdn = floor(rdn); rdn = MIN2(rdn,MaxN); n0 = (int)rdn; n1 = N-n0; /* Nombre 'n0' de bits '0' et nombre 'n1' de bits '1' a generer. */ { int nc0=0,nc1=0; int index=0; int Lbits[N]; int index1,index2; while (generer == VRAI) { double rdn_bit=drand48(); int bit; if (rdn_bit < 0.5) { bit = 0; nc0++; } else { bit = 1; nc1++; } Lbits[index] = bit; index++; /* Memorisation de 'n0' bits '0' et de 'n1' bits '1' repartis aleatoirement... */ if ((nc0+nc1) == N) { generer = FAUX; } else { } } for (index1=1 ; index1 <= npaquets ; index1++) /* Edition de 'npaquets' identiques : */ { /* Pour faire des tests, on peut forcer ici : */ /* */ /* int Lbits[]={1,1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,0,1,1,1,1}; */ /* */ /* soit : */ /* */ /* 1 1 1 */ /* 1 0 1 */ /* 1 1 1 */ /* */ /* 1 0 1 */ /* 0 0 0 */ /* 1 0 1 */ /* */ /* 1 1 1 */ /* 1 0 1 */ /* 1 1 1 */ /* */ /* qui decrit l'eponge de Menger "standard"... */ for (index2=0 ; index2 < N ; index2++) /* Edition d'un paquet de 'N=nc0+nc1' bits '0' et '1' repartis aleatoirement : */ { printf("%d",Lbits[index2]); if (Tabule == FAUX) { printf("\n"); } else { } } if (Tabule == VRAI) { printf(" "); } else { } } if (Tabule == VRAI) { printf("\n"); } else { } npaquets = nc1*npaquets; /* Le nombre de paquets a generer au prochain tour est 'nc1' fois plus grand que celui */ /* que l'on vient de generer... */ } Graine = Graine+PasGraine; } }