/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E V A L E U R S A L E A T O I R E S : */ /* */ /* */ /* Definition : */ /* */ /* Cette commande genere une sequence */ /* de valeurs numeriques flottantes obtenues */ /* par tirage au sort... */ /* */ /* */ /* On notera le 20200913114303 qu'il est */ /* possible de generer des listes aleatoires */ /* croissantes en cumulant les nombres generes */ /* de la facon suivante : */ /* */ /* $xci/valeurs_alea$X (...) | \ */ /* $xrv/accumule.01$X ne=0 fichier== */ /* */ /* et le tour est joue... */ /* */ /* */ /* Author of '$xci/valeurs_alea$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1994??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE #define CONTROLE_DE_L_ADAPTATION_A_UNE_LOI_DE_DISTRIBUTION_QUELCONQUE__ARGUMENT_palette__PAS_p /* Introduit le 20110403090032 a cause des arguments '"premiere=""p=""D="' ci-apres... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/substitue.01.I" /* Introduit le 20110401192032... */ #include xci/sequence.01.I" #define UTILISER_UN_ESPACE_DE_PARAMETRAGE_TRIDIMENSIONNEL \ VRAI \ /* Doit-on utiliser un espace de parametrage tridimensionnel ('VRAI') ou bidimensionnel */ \ /* ('FAUX') ? Ceci a ete introduit le 20001211162430. */ #define UTILISER_LE_GENERATEUR_A_PERIODICITE_PARAMETRABLE \ FAUX \ /* Doit-on utiliser le generateur a periodicite parametrable ('VRAI') ou l'autre ('FAUX') ? */ #define EDITER_LES_VALEURS_COURANTES_A_LA_FIN \ FAUX \ /* Si 'IL_FAUT(utiliser_le_generateur_a_periodicite_parametrable)' doit-on editer ('VRAI') */ \ /* ou pas ('FAUX') les valeurs courantes en fin de processus ? */ \ /* Ces editions sont destinees a permettre de repartir la ou l'on en est lors d'une future */ \ /* generation de nombres aleatoires. */ #define BORNE_INFERIEURE \ COORDONNEE_BARYCENTRIQUE_MINIMALE #define BORNE_SUPERIEURE \ COORDONNEE_BARYCENTRIQUE_MAXIMALE #define GRAINE \ PARE(1789) #define LE_GENERATEUR_EST_DETERMINISTE \ VRAI #define EDITER_LA_GRAINE_NON_DETERMINISTE \ FAUX /* Definition du generateur aleatoire... */ /* */ /* La possibilite de generer des valeurs aleatoires non deterministes a ete introduite */ /* le 20220723120908... */ /* */ /* La possibilite d'editer la gaine lorsque la generation n'est pas deterministe a ete */ /* introduite le 20220724121541... */ #define PERTURBER_LE_GENERATEUR_ALEATOIRE \ FAUX #define PBORNE_INFERIEURE \ NEGA(FRA10(FRA10(COORDONNEE_BARYCENTRIQUE_MAXIMALE))) #define PBORNE_SUPERIEURE \ NEUT(FRA10(FRA10(COORDONNEE_BARYCENTRIQUE_MAXIMALE))) #define PGRAINE \ PARE(1947) /* Definition du Perturbateur du generateur aleatoire (introduit le 20161125142734)... */ #define FORCER_UNE_VALEUR_PARTICULIERE \ FAUX \ /* Doit-on forcer une valeur particuliere ('VRAI') ou pas ('FAUX') lors de la generation */ \ /* des nombre aleatoires ? */ #define NUMERO_DE_LA_VALEUR_PARTICULIERE_A_FORCER \ MOYE(PREMIERE_IMAGE,DERNIERE_IMAGE) \ /* Numero de la valeur particuliere lorsque l'on doit en forcer une... */ #define VALEUR_PARTICULIERE_A_FORCER \ FZERO \ /* Definition de la valeur particuliere lorsque l'on doit en forcer une... */ #define DEPHASAGE_INITIAL \ ZERO \ /* Nombre de valeurs aleatoires a generer initialement en aveugle de facon a se dephaser */ \ /* dans la liste des valeurs aleatoires generees (introduit le 20021028090331). */ #define NOMBRE_DE_REPETITIONS_POUR_LA_GENERATION_DE_LA_VALEUR_ALEATOIRE \ UN \ /* Nombre de fois que l'on bouclera sur 'GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(...)' */ \ /* pour produire chaque valeur aleatoire (introduit le 20080310141621). */ #define NOMBRE_MAXIMAL_D_ITERATIONS_DE_LA_GENERATION_DE_LA_VALEUR_ALEATOIRE \ INFINI \ /* Nombre maximal d'iterations de generation d'une valeur aleatoire lorsque des contraintes */ \ /* sont a appliquer ('IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions)' ou */ \ /* 'IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs)'). */ #define GENERER_UNE_LISTE_DE_VALEURS_LOGIQUES \ FAUX \ /* Faut-il en fait generer des valeurs logiques {FAUX,VRAI} ? Ceci a ete introduit le */ \ /* 20041003103932 pour simplifier cette operation qui pouvait deja se faire "en sept coups". */ #define GENERER_UNE_LISTE_DE_NOMBRES_ENTIERS_SANS_COLLISIONS \ FAUX \ /* Lorque 'IL_FAUT(des_nombres_entiers)', ceux-ci peuvent-ils etre de temps en temps */ \ /* identiques ('FAUX') ou bien ne doit-il pas y avoir de collisions ('VRAI'). */ #define VERIFIER_LA_DISTANCE_ENTRE_DEUX_NOMBRES_CONSECUTIFS \ FAUX \ /* Doit-on verifier que deux nombres aleatoires consecutifs ne sont pas trop proches */ \ /* ('VRAI') ou pas ('FAUX'). */ #define DISTANCE_MINIMALE_ENTRE_DEUX_NOMBRES_CONSECUTIFS \ FZERO \ /* Lorsque 'IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs)' donne la distance */ \ /* minimale entre deux nombres aleatoires consecutifs. */ #define DISTANCE_MAXIMALE_ENTRE_DEUX_NOMBRES_CONSECUTIFS \ F_INFINI \ /* Lorsque 'IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs)' donne la distance */ \ /* maximale entre deux nombres aleatoires consecutifs (introduit le 20230114134735). */ #define N_EDITER_QUE_LA_VALEUR_MOYENNE_DES_VALEURS_ALEATOIRES_GENEREES \ FAUX \ /* Permet de n'editer que la valeur de la moyenne des nombres aleatoires calcules. Cela */ \ /* permet d'en valider la qualite (introduit le 20030926162513). */ #define EDITER_LE_MESSAGE_DE_LA_BORNE_SUPERIEURE_ENTIERE \ VRAI \ /* Permet de supprimer le message d'erreur concernant la borne superieure lorsqu'elle est */ \ /* entiere et que des nombres entiers sont demandes (introduit le 20020327172426). */ #define EPSILON_DE_CONVERSION_ENTIER_ANTERIEUR_AU_20030926 \ FDU #define EPSILON_DE_CONVERSION_ENTIER \ FZERO /* Ceci a ete introduit le 20020307120700 afin de forcer la valeur qui semble */ /* universellement utilisee et ce a la place de la valeur par defaut ('FZERO' dans */ /* 'v $xci/valeurs.01$I EPSILON_DE_CONVERSION_ENTIER'). Le passage de 'FDU' a 'FZERO' */ /* a eu lieu le 20020327172426. */ #define MAJORATION_DE_LA_BORNE_SUPERIEURE \ FU \ /* Lors de la generation de nombres entiers ('IL_FAUT(des_nombres_entiers)'), la borne */ \ /* superieure doit etre majoree (ce parametre "autonome" a ete introduit le 20030927095826). */ #include xci/valeurs.01.I" #define COMPATIBILITE_20020306 \ FAUX \ /* Permet de generer des sequences de nombres entiers identiques a celles qui auraient pu */ \ /* etre generees anterieurement au 20020306171034... */ #define COMPATIBILITE_20030926 \ FAUX \ /* Permet de generer des sequences de nombres entiers identiques a celles qui auraient pu */ \ /* etre generees anterieurement au 20030926171705... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/substitue.02.I" /* Introduit le 20110401192032... */ #include xci/valeurs.02.I" #define PLUS_PETIT_NOMBRE_ENTIER_GENERABLE \ INTE(NEGA(MILLION)) #define PLUS_GRAND_NOMBRE_ENTIER_GENERABLE \ INTE(NEUT(MILLION)) /* Definition des nombres entiers extremaux que l'on peut generer. */ #define PLUS_PETIT_NOMBRE_ENTIER(nombre) \ INTE(MAX2(FLOT(MULTIPLE_DE(ENTIER_FLOTTANT(nombre))),FLOT(PLUS_PETIT_NOMBRE_ENTIER_GENERABLE))) #define PLUS_GRAND_NOMBRE_ENTIER(nombre) \ INTE(MIN2(FLOT(MULTIPLE_DE(ENTIER_FLOTTANT(nombre))),FLOT(PLUS_GRAND_NOMBRE_ENTIER_GENERABLE))) /* Procedures de limitation des nombres entiers generables. ATTENTION : le 20020829094851, */ /* j'ai applique 'MULTIPLE_DE(ENTIER_FLOTTANT(...))' a 'nombre' car, en effet, cela */ /* manquait et dans le cas 'IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions)' */ /* ne donnait pas du tout le resultat attendu, puisqu'il y avait malgre tout des collisions. */ #define PLUS_PETIT_NOMBRE_ENTIER_DEMANDE \ PLUS_PETIT_NOMBRE_ENTIER(borne_inferieure) #define PLUS_GRAND_NOMBRE_ENTIER_DEMANDE \ PLUS_GRAND_NOMBRE_ENTIER(borne_superieure) /* Definition des nombres entiers extremaux que l'on va generer. */ #define NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS \ COND(IFET(IL_FAUT(des_nombres_entiers) \ ,IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions) \ ) \ ,NBRE(PLUS_PETIT_NOMBRE_ENTIER_DEMANDE,PLUS_GRAND_NOMBRE_ENTIER_DEMANDE) \ ,gnnUNDEF \ ) \ /* Nombre de nombres entiers differents que l'on peut generer. Le 20030528154724, je suis */ \ /* passe de 'UNDEF' a 'gnnUNDEF' de facon a garantir une allocation memoire minimale */ \ /* (on notera au passage que cette definition a contraint temporairement a la modification */ \ /* 'v $xil/defi_c1$vv$DEF 20030528141449' afin de permettre un 'lMalo(...)' dont le nombre */ \ /* d'octets demandes et un multiple de 'NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS' et donc de */ \ /* 'UNDEF' ; malgre le remplacement de 'UNDEF' par 'gnnUNDEF' ci-dessus, la modification */ \ /* de la definition de 'UNDEF' le 20030528141449 a ete conservee car, il est vrai qu'une */ \ /* aussi grande valeur que 444444719 pour 'UNDEF' pourrait avoir des consequences */ \ /* facheuses ailleurs... */ #define GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire) \ Bblock \ EGAL(valeur_aleatoire \ ,COND(IL_NE_FAUT_PAS(utiliser_un_espace_de_parametrage_tridimensionnel) \ ,rdnI2D(ADRESSE(point_courant_de_l_espace_de_parametrage_2D) \ ,graine \ ,RDN_INIT_AND_GENERE \ ,borne_inferieure,borne_superieure \ ) \ ,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage_3D) \ ,graine \ ,RDN_INIT_AND_GENERE \ ,borne_inferieure,borne_superieure \ ) \ ) \ ); \ /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree */ \ /* par le point courant de l'espace de parametrage. On notera que jusqu'au 19990916114633, */ \ /* il y avait ici : */ \ /* */ \ /* ,FLOT(borne_inferieure),FLOT(borne_superieure) */ \ /* */ \ /* mais, 'borne_inferieure' et 'borne_superieure' ayant le type 'Float', les 'FLOT(...)' */ \ /* sont donc inutiles... */ \ \ Test(IL_FAUT(perturber_le_generateur_aleatoire)) \ Bblock \ DEFV(Float,INIT(perturbation \ ,COND(IL_NE_FAUT_PAS(utiliser_un_espace_de_parametrage_tridimensionnel) \ ,rdnI2D(ADRESSE(point_courant_de_l_espace_de_parametrage_2D) \ ,Pgraine \ ,RDN_INIT_AND_GENERE \ ,Pborne_inferieure,Pborne_superieure \ ) \ ,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage_3D) \ ,Pgraine \ ,RDN_INIT_AND_GENERE \ ,Pborne_inferieure,Pborne_superieure \ ) \ ) \ ) \ ); \ INCR(valeur_aleatoire,perturbation); \ /* Perturbation de la valeur aleatoire (introduite le 20161125142734)... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ SPIRALE_INITIALISATION; \ /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'. */ \ SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage_2D,x) \ ,ASD1(point_courant_de_l_espace_de_parametrage_2D,y) \ ); \ SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage_3D,x) \ ,ASD1(point_courant_de_l_espace_de_parametrage_3D,y) \ ); \ /* Deplacement du point courant de la spirale de l'espace de parametrage, et ce en restant */ \ /* dans un plan Z=constante (Zmin)... */ \ SPIRALE_PARCOURS; \ /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant... */ \ Eblock #define DETECTEUR_DE_COLLISIONS(nombre) \ IdTb1(nombre_entier_deja_rencontre \ ,INDX(PLUS_GRAND_NOMBRE_ENTIER(PLUS_PETIT_NOMBRE_ENTIER(nombre)),PLUS_PETIT_NOMBRE_ENTIER_DEMANDE) \ ,NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS \ ) \ /* Acces au detecteur de collisions... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E V A L E U R S A L E A T O I R E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE)); /* Numero de la derniere image. */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Logical,INIT(utiliser_un_espace_de_parametrage_tridimensionnel,UTILISER_UN_ESPACE_DE_PARAMETRAGE_TRIDIMENSIONNEL)); /* Doit-on utiliser un espace de parametrage tridimensionnel ('VRAI') ou bidimensionnel */ /* ('FAUX') ? Ceci a ete introduit le 20001211162430. */ DEFV(Logical,INIT(utiliser_le_generateur_a_periodicite_parametrable,UTILISER_LE_GENERATEUR_A_PERIODICITE_PARAMETRABLE)); /* Doit-on utiliser le generateur a periodicite parametrable ('VRAI') ou l'autre ('FAUX') ? */ DEFV(Logical,INIT(editer_les_valeurs_courantes_a_la_fin,EDITER_LES_VALEURS_COURANTES_A_LA_FIN)); /* Si 'IL_FAUT(utiliser_le_generateur_a_periodicite_parametrable)' doit-on editer ('VRAI') */ /* ou pas ('FAUX') les valeurs courantes en fin de processus ? */ /* Ces editions sont destinees a permettre de repartir la ou l'on en est lors d'une future */ /* generation de nombres aleatoires. */ DEFV(Logical,INIT(forcer_une_valeur_particuliere,FORCER_UNE_VALEUR_PARTICULIERE)); /* Doit-on forcer une valeur particuliere ('VRAI') ou pas ('FAUX') lors de la generation */ /* des nombre aleatoires ? */ DEFV(Int,INIT(numero_de_la_valeur_particuliere_a_forcer,NUMERO_DE_LA_VALEUR_PARTICULIERE_A_FORCER)); /* Numero de la valeur particuliere lorsque l'on doit en forcer une... */ DEFV(Float,INIT(valeur_particuliere_a_forcer,VALEUR_PARTICULIERE_A_FORCER)); /* Definition de la valeur particuliere lorsque l'on doit en forcer une... */ DEFV(Positive,INIT(dephasage_initial,DEPHASAGE_INITIAL)); /* Nombre de valeurs aleatoires a generer initialement en aveugle de facon a se dephaser */ /* dans la liste des valeurs aleatoires generees (introduit le 20021028090331). */ DEFV(Positive,INIT(nombre_de_repetitions_pour_la_generation_de_la_valeur_aleatoire ,NOMBRE_DE_REPETITIONS_POUR_LA_GENERATION_DE_LA_VALEUR_ALEATOIRE ) ); /* Nombre de fois que l'on bouclera sur 'GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(...)' */ /* pour produire chaque valeur aleatoire (introduit le 20080310141621). */ DEFV(Positive,INIT(nombre_maximal_d_iterations_de_la_generation_de_la_valeur_aleatoire ,NOMBRE_MAXIMAL_D_ITERATIONS_DE_LA_GENERATION_DE_LA_VALEUR_ALEATOIRE ) ); /* Nombre maximal d'iterations de generation d'une valeur aleatoire lorsque des contraintes */ /* sont a appliquer ('IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions)' ou */ /* 'IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs)'). */ DEFV(Logical,INIT(generer_une_liste_de_valeurs_logiques,GENERER_UNE_LISTE_DE_VALEURS_LOGIQUES)); /* Faut-il en fait generer des valeurs logiques {FAUX,VRAI} ? Ceci a ete introduit le */ /* 20041003103932 pour simplifier cette operation qui pouvait deja se faire "en sept coups". */ DEFV(Logical,INIT(generer_une_liste_de_nombres_entiers_sans_collisions,GENERER_UNE_LISTE_DE_NOMBRES_ENTIERS_SANS_COLLISIONS)); /* Lorque 'IL_FAUT(des_nombres_entiers)', ceux-ci peuvent-ils etre de temps en temps */ /* identiques ('FAUX') ou bien ne doit-il pas y avoir de collisions ('VRAI'). */ DEFV(Logical,INIT(verifier_la_distance_entre_deux_nombres_consecutifs,VERIFIER_LA_DISTANCE_ENTRE_DEUX_NOMBRES_CONSECUTIFS)); /* Doit-on verifier que deux nombres aleatoires consecutifs ne sont pas trop proches */ /* ('VRAI') ou pas ('FAUX'). */ DEFV(Float,INIT(distance_minimale_entre_deux_nombres_consecutifs,DISTANCE_MINIMALE_ENTRE_DEUX_NOMBRES_CONSECUTIFS)); /* Lorsque 'IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs)' donne la distance */ /* minimale entre deux nombres aleatoires consecutifs. */ DEFV(Float,INIT(distance_maximale_entre_deux_nombres_consecutifs,DISTANCE_MAXIMALE_ENTRE_DEUX_NOMBRES_CONSECUTIFS)); /* Lorsque 'IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs)' donne la distance */ /* maximale entre deux nombres aleatoires consecutifs (introduit le 20230114134735). */ DEFV(Float,INIT(borne_inferieure,BORNE_INFERIEURE)); DEFV(Float,INIT(borne_superieure,BORNE_SUPERIEURE)); DEFV(Int,INIT(graine,GRAINE)); DEFV(Logical,INIT(le_generateur_est_deterministe,LE_GENERATEUR_EST_DETERMINISTE)); DEFV(Logical,INIT(editer_la_graine_non_deterministe,EDITER_LA_GRAINE_NON_DETERMINISTE)); /* Definition du generateur aleatoire... */ /* */ /* La possibilite de generer des valeurs aleatoires non deterministes a ete introduite */ /* le 20220723120908... */ /* */ /* La possibilite d'editer la gaine lorsque la generation n'est pas deterministe a ete */ /* introduite le 20220724121541... */ DEFV(Logical,INIT(perturber_le_generateur_aleatoire,PERTURBER_LE_GENERATEUR_ALEATOIRE)); DEFV(Float,INIT(Pborne_inferieure,PBORNE_INFERIEURE)); DEFV(Float,INIT(Pborne_superieure,PBORNE_SUPERIEURE)); DEFV(Int,INIT(Pgraine,PGRAINE)); /* Definition du Perturbateur du generateur aleatoire (introduit le 20161125142734)... */ #include xci/valeurs.03.I" DEFV(Logical,INIT(n_editer_que_la_valeur_moyenne_des_valeurs_aleatoires_generees ,N_EDITER_QUE_LA_VALEUR_MOYENNE_DES_VALEURS_ALEATOIRES_GENEREES ) ); DEFV(Float,INIT(cumul_des_des_valeurs_aleatoires_editees,FZERO)); /* Permet de n'editer que la valeur de la moyenne des nombres aleatoires calcules. Cela */ /* permet d'en valider la qualite (introduit le 20030926162513). */ DEFV(Logical,INIT(editer_le_message_de_la_borne_superieure_entiere,EDITER_LE_MESSAGE_DE_LA_BORNE_SUPERIEURE_ENTIERE)); /* Permet de supprimer le message d'erreur concernant la borne superieure lorsqu'elle est */ /* entiere et que des nombres entiers sont demandes (introduit le 20020327172426). */ DEFV(Float,INIT(majoration_de_la_borne_superieure,MAJORATION_DE_LA_BORNE_SUPERIEURE)); /* Lors de la generation de nombres entiers ('IL_FAUT(des_nombres_entiers)'), la borne */ /* superieure doit etre majoree (ce parametre "autonome" a ete introduit le 20030927095826). */ DEFV(Logical,INIT(compatibilite_20020306,COMPATIBILITE_20020306)); /* Permet de generer des sequences de nombres entiers identiques a celles qui auraient pu */ /* etre generees anterieurement au 20020306171034... */ DEFV(Logical,INIT(compatibilite_20030926,COMPATIBILITE_20030926)); /* Permet de generer des sequences de nombres entiers identiques a celles qui auraient pu */ /* etre generees anterieurement au 20030926171705... */ #include xci/substitue.03.I" /* Introduit le 20110401192032... */ /*..............................................................................................................................*/ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20020306=",compatibilite_20020306); GET_ARGUMENT_L("compatibilite_20030926=",compatibilite_20030926); GET_ARGUMENT_I("premiere=""p=""D=",premiere_image); GET_ARGUMENT_I("derniere=""d=""A=",derniere_image); GET_ARGUMENT_I("pas=",pas_des_images); GET_ARGUMENT_L("tridimensionnel=""3D=",utiliser_un_espace_de_parametrage_tridimensionnel); GET_ARGUMENT_N("bidimensionnel=""2D=",utiliser_un_espace_de_parametrage_tridimensionnel); /* Les parametres bidimensionnels ont ete introduits le 20080924085857... */ GET_ARGUMENT_L("periodique=",utiliser_le_generateur_a_periodicite_parametrable); GET_ARGUMENT_L("editer=",editer_les_valeurs_courantes_a_la_fin); GET_ARGUMENT_L("forcer=",forcer_une_valeur_particuliere); GET_ARGUMENT_I("Fnumero=",numero_de_la_valeur_particuliere_a_forcer); GET_ARGUMENT_F("Fvaleur=",valeur_particuliere_a_forcer); GET_ARGUMENT_I("methode=",gen_ft_____methode_standard); /* Parametre introduit le 20080924091921... */ GET_ARGUMENT_F("inferieur=""inf=""bi=",borne_inferieure); GET_ARGUMENT_F("superieur=""sup=""bs=",borne_superieure); /* Les parametres {"inferieur=","superieur="} furent introduits le 20090221161945... */ /* Les parametres {"inferieur=","superieur="} furent introduits le 20090221161945... */ GET_ARGUMENT_I("graine=""g=",graine); GET_ARGUMENT_L("deterministe=""gd=",le_generateur_est_deterministe); GET_ARGUMENT_N("non_deterministe=""gnd=",le_generateur_est_deterministe); GET_ARGUMENT_L("editer_graine_non_deterministe=""egnd=",editer_la_graine_non_deterministe); /* Parametres introduits le 20220723120908 et completes le 20220724121541... */ GET_ARGUMENT_L("Perturber=""perturber=",perturber_le_generateur_aleatoire); GET_ARGUMENT_F("Pinferieur=""Pinf=""Pbi=",Pborne_inferieure); GET_ARGUMENT_F("Psuperieur=""Psup=""Pbs=",Pborne_superieure); GET_ARGUMENT_I("Pgraine=""Pg=",Pgraine); /* Les parametres de Perturbation ont ete introduits le 20161125142734... */ /* */ /* On notera que si : */ /* */ /* Pborne_inferieure = Pborne_superieure */ /* */ /* alors cela permet de translater globalement (de cette valeur commune) la suite des */ /* nombres aleatoires generes... */ GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); GET_ARGUMENT_F("PrdnI2D_NEUT=",rdnI2D_____ponderation_NEUT); GET_ARGUMENT_F("PrdnI2D_GAUS=",rdnI2D_____ponderation_GAUS); GET_ARGUMENT_F("PrdnI2D_GAUS_esperance=",rdnI2D_____ponderation_GAUS_esperance_); GET_ARGUMENT_F("PrdnI2D_GAUS_ecart_type=",rdnI2D_____ponderation_GAUS_ecart_type); /* Parametres introduits le 20110325114445... */ GET_ARGUMENT_F("PrdnI3D_NEUT=",rdnI3D_____ponderation_NEUT); GET_ARGUMENT_F("PrdnI3D_GAUS=",rdnI3D_____ponderation_GAUS); GET_ARGUMENT_F("PrdnI3D_GAUS_esperance=",rdnI3D_____ponderation_GAUS_esperance_); GET_ARGUMENT_F("PrdnI3D_GAUS_ecart_type=",rdnI3D_____ponderation_GAUS_ecart_type); /* Parametres introduits le 20110325114445... */ CONTROLE_DE_L_ADAPTATION_A_UNE_LOI_DE_DISTRIBUTION_QUELCONQUE; /* Introduit le 20110401182314 sous cette forme... */ GET_ARGUMENT_F("x=""X=",ASD1(rdn_iteratif_cercle_____point_courant_sur_la_droite,x)); GET_ARGUMENT_F("y=""Y=",ASD1(rdn_iteratif_cercle_____point_courant_sur_la_droite,y)); GET_ARGUMENT_F("pente=""Ad=",rdn_iteratif_cercle_____pente_A_de_la_droite); /* Le 20050623152334, "A=" a ete remplace par "Ad=" (double definition...). */ GET_ARGUMENT_F("ordonnee=""Bd=",rdn_iteratif_cercle_____ordonnee_a_l_origine_B_de_la_droite); /* Le 20050623152334, "B=" a ete remplace par "Bd=" (double definition...). */ GET_ARGUMENT_F("pd=""pas_droite=",rdn_iteratif_cercle_____pas_de_parcours_de_la_droite); /* Le 20050623152334, "pas=" a ete remplace par "pas_droite=" et "pd=" (double def...). */ GET_ARGUMENT_F("rayon=",rdn_iteratif_cercle_____rayon_minimal_des_cercles); GET_ARGUMENT_F("facteur=""extension=",rdn_iteratif_cercle_____facteur_d_extension_du_rayon_des_cercles); GET_ARGUMENT_I("saut=",rdn_iteratif_cercle_____nombre_de_nombres_aleatoires_a_sauter); GET_ARGUMENT_F("nombre=",rdn_iteratif_cercle_____nombre_aleatoire_courant); GET_ARGUMENT_L("premiere_racine=",rdn_iteratif_cercle_____prendre_la_premiere_racine); GET_ARGUMENT_I("dephasage=",dephasage_initial); GET_ARGUMENT_I("nombre_repetitions=""nr=",nombre_de_repetitions_pour_la_generation_de_la_valeur_aleatoire); GET_ARGUMENT_I("iterations=""bouclage=" ,nombre_maximal_d_iterations_de_la_generation_de_la_valeur_aleatoire ); GET_ARGUMENT_L("sans_collisions=""sc=",generer_une_liste_de_nombres_entiers_sans_collisions); /* Le parametre "sc=" fut introduit le 20090221161945... */ GET_ARGUMENT_N("collisions=""c=",generer_une_liste_de_nombres_entiers_sans_collisions); GET_ARGUMENT_L("verifier_distance=""vd=",verifier_la_distance_entre_deux_nombres_consecutifs); GET_ARGUMENT_F("dm=""distance_minimale=",distance_minimale_entre_deux_nombres_consecutifs); GET_ARGUMENT_F("dM=""distance_maximale=",distance_maximale_entre_deux_nombres_consecutifs); /* Les parametres "dM=""distance_maximale=" furent introduits le 20230114134735... */ GET_ARGUMENT_L("moyenne=",n_editer_que_la_valeur_moyenne_des_valeurs_aleatoires_generees); GET_ARGUMENT_L("logiques=""booleens=",generer_une_liste_de_valeurs_logiques); GET_ARGUMENT_L("message_borne_superieure_entiere=""mbse=" ,editer_le_message_de_la_borne_superieure_entiere ); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; /* Cette procedure fut introduite le 20061226185610... */ GET_ARGUMENT_F("majoration=",majoration_de_la_borne_superieure); ) ); #include xci/substitue.05.I" /* Introduit le 20110401192032... */ Test(EST_FAUX(le_generateur_est_deterministe)) /* Test introduit le 20220723120908... */ Bblock DEFV(Positive,INIT(Secondes,UNDEF)); DEFV(Positive,INIT(MicroSecondes,UNDEF)); DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes,MicroSecondes); INCR(graine,ADD2(Secondes,MicroSecondes)); /* La graine est donc fonction de la duree ecoulee depuis le 01/01/1970 00:00:00 et le */ /* generateur n'est donc plus deterministe... */ /* */ /* Le 20220724100541, meme si cela est completement inutile, je suis passe de */ /* 'EGAL(graine,...)' a 'INCR(graine,...)'... */ Test(IL_FAUT(editer_la_graine_non_deterministe)) /* Test introduit le 20220724121541... */ Bblock CAL2(Prin1("graine=%d\n",graine)); /* Il peut etre utile de connaitre la graine aleatoire utilisee au cas ou l'on voudrait */ /* reproduire cette generation... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(generer_une_liste_de_valeurs_logiques)) Bblock EGAL(des_nombres_entiers,VRAI); EGAL(editer_le_message_de_la_borne_superieure_entiere,FAUX); EGAL(borne_inferieure,FLOT(FAUX)); EGAL(borne_superieure,FLOT(VRAI)); EGAL(compatibilite_20020306,FAUX); EGAL(compatibilite_20030926,FAUX); EGAL(valeurs_signees,chain_Acopie(C_VIDE)); /* Ainsi, les options utiles sont forcees afin de generer des 'Logical's. Ceci fut introduit */ /* le 20041003103932, en notant bien qu'anterieurement a cette date, cela pouvait deja se */ /* faire en forcant ces six parametres individuellement. Le 20041004111732 a ete introduit */ /* le septieme parametre 'valeurs_signees' car, en effet, il est plus correct de ne pas */ /* signer les valeurs logiques {0,1}... */ Eblock ATes Bblock Eblock ETes Test(IFET(IFLE(borne_inferieure,borne_superieure) ,IFLE(premiere_image,derniere_image) ) ) Bblock DEFV(Float,INIT(valeur_aleatoire_precedente,FLOT__UNDEF)); /* Valeur aleatoire precedente... */ DEFV(Logical,DdTb1(POINTERl ,nombre_entier_deja_rencontre ,NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS ,lMalo(MUL2(NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS,size_Logical)) ) ); /* Allocation du vecteur destine a reperer, si besoin est, les "collisions" dans les */ /* nombres entiers generes... */ DEFV(pointI_2D,point_courant_de_l_espace_de_parametrage_2D); DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage_3D); /* Point courant d'un espace abstrait servant a parametrer le generateur d'evenements. */ SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL) /* Donnees de generation d'une spirale de parcours d'un espace abstrait bidimensionnel */ /* de parametrage de la generation des evenements. */ /* ATTENTION : jusqu'au 20010926155950, il y avait ici : */ /* */ /* SPIRALE_REINITIALISATION_BRAS_ET_DELTAS; */ /* */ /* qui provenait d'un "copier-coller" un peu large. Il ne sert a rien et a ete supprime... */ SPIRALE_VALIDATION; /* Validation des pas de parcours (pasX,pasY) de l'espace abstrait de parametrage du */ /* generateur d'evenements. */ INITIALISATION_POINT_2D(point_courant_de_l_espace_de_parametrage_2D,Xmin,Ymin); INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage_3D,Xmin,Ymin,Zmin); /* Initialisation de l'espace de parametrage independante du format de l'image, puisque le */ /* point 'min' n'en depend pas... */ Test(IFET(IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions) ,IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs) ) ) Bblock PRINT_ATTENTION("il est pratiquement impossible de satisfaire simultanement les deux contraintes demandees"); PRINT_ATTENTION("(generer des nombres sans collisions et respecter la distance entre deux nombres consecutifs)"); Eblock ATes Bblock Eblock ETes Test(IFET(IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs) ,IFOU(IFLE(SOUA(borne_superieure,borne_inferieure) ,distance_minimale_entre_deux_nombres_consecutifs ) ,IFLE(distance_maximale_entre_deux_nombres_consecutifs ,distance_minimale_entre_deux_nombres_consecutifs ) ) ) ) Bblock PRINT_ERREUR("il est impossible de respecter les distances minimale et maximale entre deux nombres aleatoires"); CAL1(Prer2("les bornes du generateur sont (%+.^^^,%+.^^^)\n" ,borne_inferieure ,borne_superieure ) ); /* Le 20060105155422, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123311, le format "^^g" est passe a "^^^" pour plus de souplesse... */ EGAL(distance_minimale_entre_deux_nombres_consecutifs,DISTANCE_MINIMALE_ENTRE_DEUX_NOMBRES_CONSECUTIFS); /* On change arbitrairement cette distance minimale... */ EGAL(distance_maximale_entre_deux_nombres_consecutifs,DISTANCE_MAXIMALE_ENTRE_DEUX_NOMBRES_CONSECUTIFS); /* On supprime arbitrairement cette distance maximale... */ CAL1(Prer1("la distance minimale est donc supprimee en prennant la valeur %+.^^^ " ,distance_minimale_entre_deux_nombres_consecutifs ) ); /* Le 20060105155422, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123311, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CAL1(Prer1("et la distance maximale est supprimee en prennant la valeur %+.^^^\n" ,distance_maximale_entre_deux_nombres_consecutifs ) ); Eblock ATes Bblock Eblock ETes Test(IL_FAUT(des_nombres_entiers)) Bblock Test(fEST_ENTIER(borne_superieure)) /* Avant le 20011216160849, ce test n'etait effectue que si */ /* 'IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions)', mais en fait, grace */ /* a 'v $xcg/chiffrage.21$Z valeurs_alea.X', il est apparu qu'il etait necessaire des que */ /* des nombres entiers etaient demandes. Simultanement, l'increment de 'borne_superieure' */ /* est passe de 'FDU' a 'SOUS(FU,gEPSILON)' ce qui est plus "equitable"... */ Bblock Test(IL_FAUT(compatibilite_20030926)) Bblock EGAL(epsilon_de_conversion_entier,EPSILON_DE_CONVERSION_ENTIER_ANTERIEUR_AU_20030926); /* Malheureusement, cela ne peut se faire lors de l'initialisation de la variable */ /* 'epsilon_de_conversion_entier' ci-dessus car, en effet, a ce moment-la, l'indicateur */ /* 'compatibilite_20030926' n'a pas encore la valeur eventuellement entree via le */ /* 'GET_ARGUMENT_L(...)' correspondant... */ Eblock ATes Bblock Eblock ETes INCR(borne_superieure ,SOUS(COND(IL_NE_FAUT_PAS(compatibilite_20020306) ,COND(IL_NE_FAUT_PAS(compatibilite_20030926) ,majoration_de_la_borne_superieure ,epsilon_de_conversion_entier ) ,FU ) ,mgEPSILON ) ); /* Les bornes du generateur aleatoire sont tres rarement atteintes. Ceci n'est pas genant */ /* pour la borne inferieure lors de sa conversion en entier puisqu'on utilise 'INTE(...)', */ /* (cela implique qu'elle est donc atteinte en entier puisqu'on arrondi par defaut) ; */ /* mais par contre, pour la borne superieure cela est tres ennuyeux car cela signifie */ /* qu'elle ne sera jamais atteinte en entier (l'arrondi par defaut donnera l'entier qui */ /* precede la borne superieure...). Le 20011218133414, je suis passe de 'gEPSILON' (qui */ /* etait donc utilise depuis le 20011216160849) a 'mgEPSILON' afin que le CAL1(Prer1(...))' */ /* qui suit edite correctement un nombre decimal (n'ayant pas l'apparence d'un nombre */ /* entier...). Le 20020306171034 je me suis rendu compte qu'il fallait non pas utiliser */ /* 'FU' mais bien plutot 'epsilon_de_conversion_entier' car, en effet, dans le cas de 'FU' */ /* la translation apportee aux nombres flottants generes avant leur conversion en entiers */ /* est en quelque sorte egale a 'FU-mgEPSILON+epsilon_de_conversion_entier' ce qui pouvait */ /* produire des nombres entiers egaux a la borne superieure plus 1 ; cela s'est vu dans la */ /* generation de fichiers tels '$xTG/COLLISIONNABLE' dans */ /* 'v _____xivPdf_09_2/.REFL.m.53.1.$U entiers'. A partir du 20020306171034, la translation */ /* devient egale a 'epsilon_de_conversion_entier-mgEPSILON+epsilon_de_conversion_entier' */ /* fictivement (puisqu'en effet elle porte d'une part sur la borne superieure pour ce qui */ /* est de 'epsilon_de_conversion_entier-mgEPSILON' et d'autre part sur la partie conversion */ /* pour ce qui est de nouveau de 'epsilon_de_conversion_entier'...). Le 20020311142707, */ /* j'ai introduit "compatibilite_20020306" afin de permettre d'assurer la compatibilite */ /* avec des choses faites anterieurement au 20020306171034... */ /* */ /* Le 20030926170657 (apres l'introduction le 20030926162513 de l'option "moyenne=" */ /* permettant de n'editer que la moyenne des valeurs calculees), il est apparu qu'une */ /* bonne valeur de 'epsilon_de_conversion_entier' permettant d'obtenir une repartition */ /* equitable de {0,1} ("inf=0 sup=1 entiers=vrai") est approximativement egale a 1/3. */ /* Cela reste vrai si les entiers demandes sont dans un ensemble plus vaste que {0,1}... */ /* Mais le 20020327172426, il m'est apparu evident qu'il fallait decoupler le parametre */ /* 'epsilon_de_conversion_entier' de l'incrementation de la borne superieure. Etant donne */ /* que le passage de flottant en entier se fait par 'vs :AINT:' via 'vs :AINT_a_peu_pres:' */ /* dans 'vs :ENTIER_FLOTTANT:', il est devenu evident qu'il faut en general utiliser : */ /* */ /* epsilon_de_conversion_entier = 0 */ /* */ /* afin de ramener sans "distorsion" tout nombre flottant au nombre entier inferieur le */ /* plus proche, ce qui permet de generer la bonne frequence de nombres entiers egaux a la */ /* borne inferieure ('borne_inferieure'). Cela conduit donc a introduire un nouveau */ /* parametre 'majoration_de_la_borne_superieure' utilise uniquement pour incrementer */ /* la borne superieure : */ /* */ /* majoration_de_la_borne_superieure = 1 */ /* */ /* en notant que la valeur effective est 'majoration_de_la_borne_superieure-mgEPSILON', */ /* soit en general : */ /* */ /* majoration_de_la_borne_superieure = 0.999999999 */ /* */ /* ce qui permet de generer la bonne frequence de nombres entiers egaux a la borne */ /* superieure ('borne_superieure'). Ainsi, on garantit la bonne frequence de tous les */ /* nombres entiers dans [borne_inferieure,borne_superieure]. */ /* */ /* */ /* Le 20030927190651 je note qu'il est possible de generer une liste de N nombres aleatoires */ /* entiers parfaitement equirepartis. Supposons pour simplifier que N est pair et que les */ /* nombres entiers aleatoires doivent etre dans [0,1]. Il suffit de generer deux fichiers */ /* 'F(0)' et 'F(1)' de longueur commune N/2 : */ /* */ /* F(0) = {0,0,...,0} */ /* F(1) = {1,1,...,1} */ /* */ /* puis un fichier 'FP' de N nombres aleatoires dans [0,N-1] sans collisions (il s'agit */ /* donc d'une permutation de {0,1,2,...,N-1}) : */ /* */ /* FP = PermutationAleatoire{0,1,2,...,N-1} */ /* */ /* Enfin, la concatenation de 'F(0)' et de 'F(1)' est permutee grace a '$xrv/permute.11$X' */ /* avec les arguments : */ /* */ /* fichier=Concatenation(F(0),F(1)) */ /* permutation=FP */ /* */ /* Cela se generalise pour des segments [a,b] plus vastes que [0,1] ; il suffit alors que */ /* 'N' soit un multiple de b-a+1 et de generer b-a+1 fichiers 'F(i)' : */ /* */ /* F(a) = {a,a,...,a} */ /* (...) */ /* F(i) = {i,i,...,i} */ /* (...) */ /* F(b) = {b,b,...,b} */ /* */ /* ces b-a+1 fichiers etant de longueur commune N/(b-a+1) et le fichier 'FP' etant defini */ /* comme ci-dessus dans le cas [0,1]... */ /* */ /* Evidemment, cela laisse supposer que 'N' est connu a l'avance. Si tel n'est pas le cas, */ /* ou s'il simplement il faut une suite indeterminee (infinie...) de nombres aleatoires */ /* entiers parfaitement equirepartis, il suffit de choisir un 'N' grand (et multiple de */ /* b-a+1) et d'iterer ensuite la procedure precedente en changeant la graine a chaque */ /* nouvelle iteration... */ Test(IL_FAUT(editer_le_message_de_la_borne_superieure_entiere)) Bblock PRINT_ERREUR("la borne superieure est entiere et risque d'etre inaccessible"); CAL1(Prer1("elle est donc augmentee et prend la valeur %+.^^^\n",borne_superieure)); /* Le 20060105155422, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123311, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions)) Bblock DEFV(Int,INIT(nombre_entier,UNDEF)); /* Nombre entier courant lors de l'initialisation. */ Test(IFOU(IFLT(borne_inferieure,PLUS_PETIT_NOMBRE_ENTIER_GENERABLE) ,IFGT(borne_superieure,PLUS_GRAND_NOMBRE_ENTIER_GENERABLE) ) ) Bblock PRINT_ERREUR("les capacites de gestion sont insuffisantes"); CAL1(Prer2("les bornes du generateur sont (%+.^^^,%+.^^^)\n" ,borne_inferieure ,borne_superieure ) ); /* Le 20060105155422, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123311, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CAL1(Prer2("alors que l'on ne peut gerer que (%d,%d)\n" ,PLUS_PETIT_NOMBRE_ENTIER_GENERABLE ,PLUS_GRAND_NOMBRE_ENTIER_GENERABLE ) ); Eblock ATes Bblock Eblock ETes Test(IFGT(NBRE(premiere_image,derniere_image),NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS)) Bblock PRINT_ERREUR("trop de nombres entiers differents sont demandes"); CAL1(Prer1("%d nombres entiers differents sont demandes\n",NBRE(premiere_image,derniere_image))); CAL1(Prer1("alors que seulement %d peuvent etre generes\n",NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS)); PRINT_ERREUR("il y aura donc des collisions"); EGAL(generer_une_liste_de_nombres_entiers_sans_collisions,FAUX); /* Et les collisions sont autorisees... */ Eblock ATes Bblock Eblock ETes DoIn(nombre_entier,PLUS_PETIT_NOMBRE_ENTIER_DEMANDE,PLUS_GRAND_NOMBRE_ENTIER_DEMANDE,pas_des_images) Bblock EGAL(DETECTEUR_DE_COLLISIONS(nombre_entier),FAUX); /* Initialisation ("il n'y a pas encore de collisions"...). */ Eblock EDoI Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_NE_FAUT_PAS(utiliser_le_generateur_a_periodicite_parametrable)) Bblock Repe(dephasage_initial) Bblock DEFV(Float,INIT(valeur_aleatoire_sautee,FLOT__UNDEF)); GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire_sautee); /* Et on saute eventuellement les 'dephasage_initial' premieres valeurs aleatoires... */ Eblock ERep Eblock ATes Bblock Test(IZNE(dephasage_initial)) Bblock PRINT_ERREUR("le dephasage est incompatible avec l'utilisation du generateur aleatoire periodique"); Eblock ATes Bblock Eblock ETes Eblock ETes DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images) Bblock DEFV(Logical,INIT(iterer_la_generation_de_la_valeur_aleatoire,VRAI)); /* Il faut calculer au moins une valeur aleatoire... */ DEFV(Positive,INIT(nombre_d_iterations_de_la_generation_de_la_valeur_aleatoire ,nombre_maximal_d_iterations_de_la_generation_de_la_valeur_aleatoire ) ); /* Detecteur de "bouclage"... */ DEFV(Float,INIT(valeur_aleatoire,FLOT__UNDEF)); DEFV(Float,INIT(valeur_aleatoire_a_editer,FLOT__UNDEF)); /* Valeur aleatoire courante et sa version "a editer"... */ Tant(IL_FAUT(iterer_la_generation_de_la_valeur_aleatoire)) Bblock Test(IL_NE_FAUT_PAS(utiliser_le_generateur_a_periodicite_parametrable)) Bblock Repe(nombre_de_repetitions_pour_la_generation_de_la_valeur_aleatoire) /* Cette possibilite de boucler plusieurs fois a ete introduite le 20080310141621... */ Bblock GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire); /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree */ /* par le point courant de l'espace de parametrage. */ Eblock ERep Eblock ATes Bblock EGAL(valeur_aleatoire ,rdn_iteratif_cercle() ); EGAL(valeur_aleatoire ,DENO(valeur_aleatoire,borne_inferieure,borne_superieure) ); /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] non parametree */ /* par le point courant de l'espace de parametrage. */ Eblock ETes DECR(nombre_d_iterations_de_la_generation_de_la_valeur_aleatoire,I); /* Afin de ne pas boucler eternellement... */ Test(IFET(IZGT(nombre_d_iterations_de_la_generation_de_la_valeur_aleatoire) ,I3OU(I3ET(IL_FAUT(des_nombres_entiers) ,IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions) ,EST_VRAI(DETECTEUR_DE_COLLISIONS(valeur_aleatoire)) ) ,I3ET(IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs) ,IFGT(numero_d_image,premiere_image) ,IFLE(SOUA(valeur_aleatoire,valeur_aleatoire_precedente) ,distance_minimale_entre_deux_nombres_consecutifs ) ) ,I3ET(IL_FAUT(verifier_la_distance_entre_deux_nombres_consecutifs) ,IFGT(numero_d_image,premiere_image) ,IFGE(SOUA(valeur_aleatoire,valeur_aleatoire_precedente) ,distance_maximale_entre_deux_nombres_consecutifs ) ) ) ) ) /* Le test relatif a la distance maximale a ete introduit le 20230114134735... */ Bblock /* Lorsqu'il faut generer des nombres entiers sans collisions et qu'il y a collisions, */ /* ou lorsque la distance minimale entre deux nombres consecutifs n'est pas respectee, */ /* il faut iterer... */ Eblock ATes Bblock EGAL(iterer_la_generation_de_la_valeur_aleatoire,FAUX); /* Dans le cas general, on arrete apres la premiere iteration... */ Eblock ETes Test(IL_FAUT(des_nombres_entiers)) Bblock Test(IL_FAUT(generer_une_liste_de_nombres_entiers_sans_collisions)) Bblock EGAL(DETECTEUR_DE_COLLISIONS(valeur_aleatoire),VRAI); /* A compter du 20001129160743, le detecteur de collisions n'est mis a jour que si cela */ /* est necessaire, alors qu'avant cette date, il l'etait systematiquement... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes /* La sequence {SPIRALE_INITIALISATION,SPIRALE_DEPLACEMENT,SPIRALE_PARCOURS} se trouvait ici */ /* avant le 20021028090331 et non dans 'GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(...)'. */ Eblock ETan Test(IFET(IL_FAUT(forcer_une_valeur_particuliere),IFEQ(numero_d_image,numero_de_la_valeur_particuliere_a_forcer))) Bblock EGAL(valeur_aleatoire,valeur_particuliere_a_forcer); /* Cas ou un forcage est demande... */ Eblock ATes Bblock Eblock ETes EGAL(valeur_aleatoire_a_editer,MULTIPLE_DE(ENTIER_FLOTTANT(valeur_aleatoire))); INCR(cumul_des_des_valeurs_aleatoires_editees,valeur_aleatoire_a_editer); /* Mise a jour du cumul destine au calcul de la moyenne des valeurs calculees. */ Test(IL_FAUT(n_editer_que_la_valeur_moyenne_des_valeurs_aleatoires_generees)) Bblock Eblock ATes Bblock CAL2(Prin2(Cara(chain_Aconcaten5(INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition,"\n")) ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,valeur_aleatoire_a_editer ) ); /* Edition de la valeur aleatoire courante... */ /* */ /* On notera le 20080924164416 que la commande : */ /* */ /* $xci/valeurs_alea$X p=1 d=1 graine=1234610 */ /* */ /* donne : */ /* */ /* +0.19624373093072 sur {$CMAP28,$LACT16,$LACT15} */ /* */ /* et : */ /* */ /* +0.19624373093073 sur {$LACT17,$LACT18} */ /* */ /* Mais en fait, la valeur calculee est la meme sur toutes ces MACHINEs (0.1962437309307250) */ /* la difference semblant venir de l'impression tout simplement. Au passage, on trouve : */ /* */ /* fx=-517668276 */ /* fy=+1550138109 */ /* fz=+1527002520 */ /* */ /* pour les valeurs intermediaires {fx,fy,fz} sur toutes ces MACHINEs... */ Eblock ETes EGAL(valeur_aleatoire_precedente,valeur_aleatoire); /* Memorisation de la valeur aleatoire "precedente"... */ Eblock EDoI Test(IL_FAUT(n_editer_que_la_valeur_moyenne_des_valeurs_aleatoires_generees)) Bblock CAL2(Prin2(Cara(chain_Aconcaten5(INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition,"\n")) ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,DIVI(cumul_des_des_valeurs_aleatoires_editees,FLOT(NBRE(premiere_image,derniere_image))) ) ); /* Edition de la moyenne des valeurs aleatoires (introduit le 20030926162513). */ Eblock ATes Bblock Eblock ETes Test(IL_NE_FAUT_PAS(utiliser_le_generateur_a_periodicite_parametrable)) Bblock Eblock ATes Bblock Test(IL_FAUT(editer_les_valeurs_courantes_a_la_fin)) Bblock CAL3(Prme4(Cara(chain_Aconcaten8("\n point courant sur la droite : X=%",valeurs_signees,".*",format_d_edition ," Y=%",valeurs_signees,".*",format_d_edition ) ) ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,ASD1(rdn_iteratif_cercle_____point_courant_sur_la_droite,x) ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,ASD1(rdn_iteratif_cercle_____point_courant_sur_la_droite,y) ) ); CAL3(Prme2(Cara(chain_Aconcaten4("\n nombre aleatoire courant... : nombre=%" ,valeurs_signees ,".*" ,format_d_edition ) ) ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,rdn_iteratif_cercle_____nombre_aleatoire_courant ) ); CAL3(Prme1("prendre la premiere racine. : premiere_racine=%s\n" ,ETAT_LOGIQUE(rdn_iteratif_cercle_____prendre_la_premiere_racine) ) ); /* Ces editions sont destinees a permettre de repartir la ou l'on en est lors d'une future */ /* generation de nombres aleatoires. */ Eblock ATes Bblock Eblock ETes Eblock ETes FdTb1(nombre_entier_deja_rencontre,NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS,Logical,ADRESSE_PLUS_DEFINIE); /* Liberation du vecteur destine a reperer, si besoin est, les "collisions" dans les */ /* nombres entiers generes (introduit le 20031111105925 car oublie anterieurement... */ /* */ /* Le 'ADRESSE_PLUS_DEFINIE' a ete introduit le 20050221170900... */ Eblock ATes Bblock PRINT_ERREUR("une relation d'ordre ('premier <= dernier' ou 'inferieure <= superieure') n'est pas respectee"); Eblock ETes RETU_Commande; Eblock ECommande