00001 /** @file 00002 * 00003 * Random number generation 00004 * 00005 */ 00006 00007 FILE_LICENCE ( GPL2_OR_LATER ); 00008 00009 #include <stdlib.h> 00010 #include <gpxe/timer.h> 00011 00012 static int32_t rnd_seed = 0; 00013 00014 /** 00015 * Seed the pseudo-random number generator 00016 * 00017 * @v seed Seed value 00018 */ 00019 void srandom ( unsigned int seed ) { 00020 rnd_seed = seed; 00021 } 00022 00023 /** 00024 * Generate a pseudo-random number between 0 and 2147483647L or 2147483562? 00025 * 00026 * @ret rand Pseudo-random number 00027 */ 00028 long int random ( void ) { 00029 int32_t q; 00030 00031 if ( ! rnd_seed ) /* Initialize linear congruential generator */ 00032 srandom ( currticks() ); 00033 00034 /* simplified version of the LCG given in Bruce Schneier's 00035 "Applied Cryptography" */ 00036 q = ( rnd_seed / 53668 ); 00037 rnd_seed = ( 40014 * ( rnd_seed - 53668 * q ) - 12211 * q ); 00038 if ( rnd_seed < 0 ) 00039 rnd_seed += 2147483563L; 00040 return rnd_seed; 00041 }
1.5.7.1