1/* 2 * Paretoormal distribution table generator 3 * 4 * This distribution is simply .25*normal + .75*pareto; a combination 5 * which seems to match experimentally observed distributions reasonably 6 * well, but is computationally easy to handle. 7 * The entries represent a scaled inverse of the cumulative distribution 8 * function. 9 * 10 * Taken from the uncopyrighted NISTnet code. 11 */ 12#include <stdio.h> 13#include <stdlib.h> 14#include <stdlib.h> 15#include <string.h> 16#include <math.h> 17#include <limits.h> 18#include <malloc.h> 19 20#include <linux/types.h> 21#include <linux/pkt_sched.h> 22 23#define TABLESIZE 16384 24#define TABLEFACTOR NETEM_DIST_SCALE 25 26static double 27normal(double x, double mu, double sigma) 28{ 29 return .5 + .5*erf((x-mu)/(sqrt(2.0)*sigma)); 30} 31 32static const double a=3.0; 33 34static int 35paretovalue(int i) 36{ 37 double dvalue; 38 39 i = 65536-4*i; 40 dvalue = (double)i/(double)65536; 41 dvalue = 1.0/pow(dvalue, 1.0/a); 42 dvalue -= 1.5; 43 dvalue *= (4.0/3.0)*(double)TABLEFACTOR; 44 if (dvalue > 32767) 45 dvalue = 32767; 46 return (int)rint(dvalue); 47} 48 49int 50main(int argc, char **argv) 51{ 52 int i,n; 53 double x; 54 double table[TABLESIZE+1]; 55 56 for (x = -10.0; x < 10.05; x += .00005) { 57 i = rint(TABLESIZE*normal(x, 0.0, 1.0)); 58 table[i] = x; 59 } 60 printf( 61"# This is the distribution table for the paretonormal distribution.\n" 62 ); 63 64 for (i = n = 0; i < TABLESIZE; i += 4) { 65 int normvalue, parvalue, value; 66 67 normvalue = (int) rint(table[i]*TABLEFACTOR); 68 parvalue = paretovalue(i); 69 70 value = (normvalue+3*parvalue)/4; 71 if (value < SHRT_MIN) value = SHRT_MIN; 72 if (value > SHRT_MAX) value = SHRT_MAX; 73 74 printf(" %d", value); 75 if (++n == 8) { 76 putchar('\n'); 77 n = 0; 78 } 79 } 80 81 return 0; 82} 83