static void analyze_cecil (void) { int i, j; short slen, tsize, nb_generics, nb_types, dynamic_type; char *s; printf ("Analyzing Cecil\n"); /* Print two tables: non-gneric and generic */ for (j = 0, s = "Non generic table size : %d\n"; j < 2; j ++, s = "Generic table size : %d\n") { tsize = rshort (); fprintf (mfp, s, (int) tsize); i = (int) tsize; while (i--) { fprintf (mfp," Name : "); slen = rshort (); while (slen--) { fprintf (mfp,"%c", rchar ()); } fprintf (mfp,"\n"); } i = (int) tsize; while (i--) { nb_generics = rshort (); dynamic_type = rshort (); fprintf (mfp," Dynamic type : %d, Generics : %d\n", (int) dynamic_type, (int) nb_generics); if (nb_generics) { nb_types = rshort (); fprintf (mfp," Types : %d\n", (int) nb_types); rseq ((int) (nb_generics * nb_types * sizeof (int32))); rseq ((int) (nb_types * sizeof (int16))); } } } print_line (); }
void initsound(BYTE src[][2]){ #if 0 int i; for(i = 0; i < numof(soundbuf[0]); i++){ src[i][0] = 256 * i / numof(soundbuf[0]); src[i][1] = 256 - 256 * i / numof(soundbuf[0]); } #elif !defined NDEBUG && 0 int i; struct random_sequence rs; init_rseq(&rs, src); for(i = 0; i < sizeof soundbuf[0]; i++) src[i] = 0x80 + rseq(&rs) % 10 - 5; #else # if SAMPLEBITS == 8 memset(src, 0x80, sizeof soundbuf[0]); # else memset(src, 0, sizeof soundbuf[0]); # endif #endif }
uint32_t rseqf(rst *rs) { #if RSEQMETHOD==0 return ((rs->i = (rs->i) * 2110005341UL + 2531011UL) >> 3) * 445223UL; #elif RSEQMETHOD==1 /* double d = 1. / (double)MBIG;*/ uint32_t mj; if(++rs->pk1 == rs->k_ma_end) rs->pk1 = &rs->k_ma[1]; if(++rs->pk2 == rs->k_ma_end) rs->pk2 = &rs->k_ma[1]; if((mj = *rs->pk1 - *rs->pk2) < 0) mj += MBIG; return (*rs->pk1 = mj); #elif RSEQMETHOD==2 return SHR3((rs->jsr)); #elif RSEQMETHOD==3 return FIB((rs->a),(rs->b)); #elif RSEQMETHOD==6 return rseq(rs); #else return MWC((rs->z),(rs->w)); #endif }
int main(int argc, char *argv[]){ double n = 1; int test_init = 0; int test_method = 0; int test_period = 0; if(argc < 2){ printf("usage: %s [-i] [-m] [-p] repeats\n", argv[0]); printf(" Tests pseudo random number generator algorithms repeats times. Default once.\n"); printf(" -i Profiles initialization cost instead of generation.\n"); printf(" -m Profiles Mersenne Twister.\n"); printf(" -p Profiles period of the number sequence.\n"); return 1; } { int a = 0; for(a = 1; a < argc; a++){ if(!strcmp(argv[a], "-i")){ test_init = 1; } else if(!strcmp(argv[a], "-m")) test_method = 1; // Test Mersenne Twister else if(!strcmp(argv[a], "-p")) test_period = 1; else n = atof(argv[a]); } } if(test_init){ struct random_sequence rs; double i; clock_t c = clock(); if(test_method == 0){ volatile uint32_t c = 0; for(i = 0; i < n; i++){ init_rseq(&rs, i); c = rseq(&rs); // Make sure initialization runs by taking side effects } } else{ volatile uint32_t crc = 0; for(i = 0; i < n; i++){ init_genrand(i); crc = genrand_int32(); // Make sure initialization runs by taking side effects } } double seconds = (double)(clock() - c) / CLOCKS_PER_SEC; printf("second = %lg\n", seconds); printf("initialization per second = %lg\n", i / seconds); } else{ struct random_sequence rs; double i; clock_t c = clock(); if(test_method == 0){ struct random_sequence inirs; // Buffer to hold initial state vector. volatile uint32_t v = 0; init_rseq(&rs, 1); if(!test_period){ for(i = 0; i < n; i++) v = rseq(&rs); } else{ inirs = rs; for(i = 0; i < n; i++){ v = rseq(&rs); // Detect period by comparing state vector, not by returned value. // Note that random_sequence structure could have padding bytes that // don't contribute to period, but it's unlikely that those paddings // are altered between calls. if(!memcmp(&inirs, &rs, sizeof rs)){ printf("Period %lg\n", i); break; } } } } else{ volatile uint32_t v = 0; init_genrand(1); for(i = 0; i < n; i++){ v = genrand_int32(); // Measuring period of Mersenne Twister is meaningless, because it // has far more internal state vectors than the value returned. // We should be taking more than universe's lifetime to reach the period. /* if(inival == v){ printf("period %lg\n", i); break; }*/ } } double seconds = (double)(clock() - c) / CLOCKS_PER_SEC; printf("second = %lg\n", seconds); printf("generation per second = %lg\n", i / seconds); } return 0; }