mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-10 07:12:07 +00:00
Add rand.c, an implementation of G. Marsaglia KISS PRNG
This commit is contained in:
parent
881b935b65
commit
97f7ba0610
3 changed files with 75 additions and 0 deletions
2
Makefile
2
Makefile
|
@ -353,6 +353,7 @@ CLIENT_OBJS_ := \
|
||||||
src/common/misc.o \
|
src/common/misc.o \
|
||||||
src/common/netchan.o \
|
src/common/netchan.o \
|
||||||
src/common/pmove.o \
|
src/common/pmove.o \
|
||||||
|
src/common/rand.o \
|
||||||
src/common/szone.o \
|
src/common/szone.o \
|
||||||
src/common/zone.o \
|
src/common/zone.o \
|
||||||
src/common/command/cmd_execution.o \
|
src/common/command/cmd_execution.o \
|
||||||
|
@ -403,6 +404,7 @@ SERVER_OBJS_ := \
|
||||||
src/common/misc.o \
|
src/common/misc.o \
|
||||||
src/common/netchan.o \
|
src/common/netchan.o \
|
||||||
src/common/pmove.o \
|
src/common/pmove.o \
|
||||||
|
src/common/rand.o \
|
||||||
src/common/szone.o \
|
src/common/szone.o \
|
||||||
src/common/zone.o \
|
src/common/zone.o \
|
||||||
src/common/command/cmd_execution.o \
|
src/common/command/cmd_execution.o \
|
||||||
|
|
|
@ -757,4 +757,8 @@ void SV_Init (void);
|
||||||
void SV_Shutdown (char *finalmsg, qboolean reconnect);
|
void SV_Shutdown (char *finalmsg, qboolean reconnect);
|
||||||
void SV_Frame (int msec);
|
void SV_Frame (int msec);
|
||||||
|
|
||||||
|
/* Random number generator */
|
||||||
|
int randk(void);
|
||||||
|
void randk_seed(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
69
src/common/rand.c
Normal file
69
src/common/rand.c
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* KISS PRNG (c) 2011 Shinobu
|
||||||
|
*
|
||||||
|
* This file was optained from zuttobenkyou.wordpress.com
|
||||||
|
* and modified by the Yamagi Quake II developers.
|
||||||
|
*
|
||||||
|
* LICENSE: Public domain
|
||||||
|
*
|
||||||
|
* =======================================================================
|
||||||
|
*
|
||||||
|
* KISS PRNG, as devised by Dr. George Marsaglia
|
||||||
|
*
|
||||||
|
* =======================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define QSIZE 0x200000
|
||||||
|
#define CNG (cng = 6906969069ULL * cng + 13579)
|
||||||
|
#define XS (xs ^= (xs << 13), xs ^= (xs >> 17), xs ^= (xs << 43))
|
||||||
|
#define KISS (B64MWC() + CNG + XS)
|
||||||
|
|
||||||
|
static uint64_t QARY[QSIZE];
|
||||||
|
static int j;
|
||||||
|
static uint64_t carry;
|
||||||
|
static uint64_t xs;
|
||||||
|
static uint64_t cng;
|
||||||
|
|
||||||
|
uint64_t
|
||||||
|
B64MWC(void)
|
||||||
|
{
|
||||||
|
uint64_t t, x;
|
||||||
|
|
||||||
|
j = (j + 1) & (QSIZE - 1);
|
||||||
|
x = QARY[j];
|
||||||
|
t = (x << 28) + carry;
|
||||||
|
carry = (x >> 36) - (t < x);
|
||||||
|
return QARY[j] = t - x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate a pseudorandom
|
||||||
|
* signed integer.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
randk(void)
|
||||||
|
{
|
||||||
|
return (int)KISS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
randk_seed(void)
|
||||||
|
{
|
||||||
|
uint64_t i;
|
||||||
|
|
||||||
|
/* Seed QARY[] with CNG+XS: */
|
||||||
|
for (i = 0; i < QSIZE; i++)
|
||||||
|
{
|
||||||
|
QARY[i] = CNG + XS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Run through several rounds
|
||||||
|
to warm up the state */
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
randk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue