scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

0090-rand.c (1120B)


      1 #include <assert.h>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <limits.h>
      5 
      6 /*
      7 output:
      8 testing
      9 test1
     10 test2
     11 done
     12 end:
     13 */
     14 
     15 #define NR_BINS 64
     16 #define NR_DOTS 16000
     17 #define CRITLVL 82.53
     18 
     19 static void
     20 test1(void)
     21 {
     22 	int max, min, i, n;
     23 	float chi, d;
     24 	static int bins[NR_BINS];
     25 
     26 	puts("test1");
     27 	for (i = 0; i < NR_DOTS; ++i) {
     28 		n = rand();
     29 		assert(n >= 0 && n <= RAND_MAX);
     30 		bins[n & NR_BINS-1]++;
     31 	}
     32 
     33 	chi = 0;
     34 	for (i = 0; i < NR_BINS; ++i) {
     35 		d = bins[i] - (float) NR_DOTS / NR_BINS;
     36 		d *= d;
     37 		d /= (float) NR_DOTS / NR_BINS;
     38 		chi += d;
     39 	}
     40 
     41 	assert(chi <= CRITLVL);
     42 }
     43 
     44 #undef NR_DOTS
     45 
     46 #define NR_SEEDS 10
     47 #define NR_DOTS  32
     48 
     49 static void
     50 test2(void)
     51 {
     52 	int i, j, dots[NR_SEEDS][NR_DOTS];
     53 	unsigned seeds[NR_SEEDS];
     54 
     55 	puts("test2");
     56 	for (i = 0; i < NR_SEEDS; i++)
     57 		seeds[i] = rand();
     58 
     59 	for (i = 0; i < NR_SEEDS; i++) {
     60 		srand(seeds[i]);
     61 
     62 		for (j = 0; j < NR_DOTS; ++j)
     63 			dots[i][j] = rand();
     64 	}
     65 
     66 	for (i = 0; i < NR_SEEDS; i++) {
     67 		srand(seeds[i]);
     68 
     69 		for (j = 0; j < NR_DOTS; ++j)
     70 			assert(dots[i][j] == rand());
     71 	}
     72 }
     73 
     74 int
     75 main(void)
     76 {
     77 	puts("testing");
     78 	test1();
     79 	test2();
     80 	puts("done");
     81 
     82 	return 0;
     83 }