/*************************************************************************************************************************************/ /* */ /* S H U F F L E : */ /* */ /* */ /* Author of '$xrD/shuffle.01$K' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 19????????????). */ /* */ /*************************************************************************************************************************************/ #define ZERO 0 #define BIT 1 #define CX 0x0000000f #define NBITCX 4 #define MEXP 0xff000000 #define CEXP (NBITCX*2) #define MEXPBIT 0xff800000 #define CEXPBIT (NBITCX*2+1) #define MMOT 0xffffffff #define NBITMO 32 #define MAGIK 7 SHUFFLE(work) int work; { return work * MAGIK; } shuffle(work) int work; { int n; unsigned kumul = ZERO; unsigned chumul = ZERO; unsigned exp = (work & MEXP) >> (NBITMO - CEXP); unsigned workl = work ^ (exp << (NBITMO - CEXP)); unsigned chiffre; for (n = ZERO ; n < (NBITMO / NBITCX) - (CEXP / NBITCX) ; n++) { chiffre = (((workl & CX) * MAGIK) & CX); chumul = (chumul << BIT) ^ chiffre; kumul = (kumul >> NBITCX) | ((chiffre) << (NBITMO - NBITCX)); workl = workl >> NBITCX; } return (kumul >> CEXP) | ((exp ^ chumul) << (NBITMO - CEXP)); } fpermutation(work) int work; { int n; unsigned kumul = ZERO; unsigned exp = (work & MEXPBIT) >> (NBITMO - CEXPBIT); unsigned workl = work ^ (exp << (NBITMO - CEXPBIT)); unsigned chiffre; for (n = ZERO ; n < NBITMO - CEXPBIT ; n++) { chiffre = workl & BIT; kumul = (kumul << BIT) | chiffre; workl = workl >> BIT; } return (kumul) | ((exp) << (NBITMO - CEXPBIT)); } ipermutation(work) int work; { int n; unsigned kumul = ZERO; unsigned workl = work; unsigned chiffre; for (n = ZERO ; n < NBITMO ; n++) { chiffre = workl & BIT; kumul = (kumul << BIT) | chiffre; workl = workl >> BIT; } return (kumul); } main() { union mixte { float f; unsigned i; }; union mixte e; float work = 0.0; float rdn = 0.0; double moyenne = 0.0; int nombre = 100; int pas = 10000000 - 1; int n; for (n = ZERO ; n < nombre * pas ; n = n + pas) { e.f = work; e.i = n; CAL2(Prin0("\n")); CAL2(Prin1(" avant = %d",e.i)); e.i = ipermutation(e.i); rdn = e.i; CAL2(Prin1(" apres = %u",e.i)); moyenne = moyenne + rdn; work = work + 0.01073; } CAL2(Prin1("moyenne = %g\n",moyenne / nombre)); }