+
+
+static unsigned char random_numbers[256];
+static int random_numbers_available = 0;
+
+int get_random(int min, int max) {
+ int requested_bytes = 0;
+ unsigned int rnd_width = max-min;
+ if((rnd_width % (0xFF000000)))
+ requested_bytes = 4;
+ else if((rnd_width % (0xFF0000)))
+ requested_bytes = 3;
+ else if((rnd_width % (0xFF00)))
+ requested_bytes = 2;
+ else
+ requested_bytes = 1;
+
+ //get_random_generate:
+
+ if(random_numbers_available < requested_bytes) {
+ // generate new random numbers
+ #ifdef WIN32
+ HMODULE hLib=LoadLibrary("ADVAPI32.DLL");
+ if (hLib) {
+ BOOLEAN (APIENTRY *pfn)(void*, ULONG) = (BOOLEAN (APIENTRY *)(void*,ULONG))GetProcAddress(hLib,"SystemFunction036");
+ if(pfn) {
+ ULONG ulCbBuff = sizeof(random_numbers) - random_numbers_available;
+ if(pfn(random_numbers + random_numbers_available,ulCbBuff)) {
+ random_numbers_available += ulCbBuff;
+ }
+ }
+ FreeLibrary(hLib);
+ }
+ #else
+ int randomData = open("/dev/random", O_RDONLY);
+ int randLen = sizeof(random_numbers) - random_numbers_available;
+ size_t randomDataLen = random_numbers_available;
+ while (randomDataLen < randLen) {
+ ssize_t result = read(randomData, ((char*)random_numbers) + randomDataLen, randLen - randomDataLen);
+ if (result < 0)
+ break;
+ randomDataLen += result;
+ }
+ random_numbers_available = randomDataLen;
+ close(randomData);
+ #endif
+
+ if(random_numbers_available < requested_bytes) {
+ //system random number generators failed!
+
+ }
+ }
+
+ int rnd = 0;
+ int i = 0;
+ do {
+ if(i)
+ rnd <<= 8;
+ rnd |= random_numbers[--random_numbers_available];
+ } while(++i < requested_bytes);
+
+ // TODO: find better solution for this
+ //if((rnd % rnd_width) > rnd_width)
+ // goto get_random_generate;
+
+ return min + (rnd % rnd_width);
+}
+