#include #include #define a 16807 //7^5 #define m 0x7FFFFFFF //2^31 - 1 /* Linear kongurent generator med a = 16807 c = 0 m = 2^31 -1 */ float rnd(unsigned long *seed) { unsigned long seedv, seedh; /* unsigned gör att >> och << fungerar binärt och inte som division resp mult med tvåpotenser */ seedv = a * (*seed >> 16); /* Dela upp fröet i två delar */ seedh = a * (*seed & 0x0000FFFFL); *seed = ((seedv & 0x00007FFFL) << 16) + (seedv >> 15) + seedh; if((*seed >> 31) == 1) { /* ta modulo 2^31 -1 */ *seed = (*seed & 0x7FFFFFFFL) + 1; } return ((float)*seed) / m; //Returnera ett tal i intervallet ]0, 1[ } main() { unsigned long seed = time(NULL); int i; for(i=0;i<15;i++) { /* Skicka med adressen till variablen så att fröet ändras efter varje anrop */ printf("%.8f\n",rnd(&seed)); } }