improved prng

This commit is contained in:
Luxferre
2023-08-10 09:11:43 +03:00
parent 5bd1524917
commit 9acabe0de8
2 changed files with 8 additions and 6 deletions
+7 -5
View File
@@ -1061,9 +1061,11 @@ char *prim_tm(char *arglist, char *res, int *reslen) {
}
static unsigned long long nnt_rngs; /* PRNG state*/
unsigned long long xorshift64() {
nnt_rngs^=(nnt_rngs<<13);nnt_rngs^=(nnt_rngs>>7);nnt_rngs^=(nnt_rngs<<17);
return nnt_rngs;
unsigned long long xorshift64s() {
nnt_rngs^=(nnt_rngs>>12);nnt_rngs^=(nnt_rngs<<25);nnt_rngs^=(nnt_rngs>>27);
unsigned long long inter = (nnt_rngs * 0x2545F4914F6CDD1DULL) >> 32;
nnt_rngs^=(nnt_rngs>>12);nnt_rngs^=(nnt_rngs<<25);nnt_rngs^=(nnt_rngs>>27);
return (inter << 32) | ((nnt_rngs * 0x2545F4914F6CDD1DULL) & 0xFFFFFFFF);
}
/* [new] rn primitive: (pseudo)random number */
@@ -1073,7 +1075,7 @@ char *prim_rn(char *arglist, char *res, int *reslen) {
*tos = strtok(NULL, NNT_ADEL_S);
long long a = (froms == NULL) ? 0 : snum(froms),
b = (tos == NULL) ? ARITH_LIMIT : snum(tos);
res = n2s(a == b ? a : (a + xorshift64() % (b - a)), res, reslen);
res = n2s(a == b ? a : (a + xorshift64s() % (b - a)), res, reslen);
return res;
}
@@ -1081,7 +1083,7 @@ char *prim_rn(char *arglist, char *res, int *reslen) {
void nnt_init() {
nnt_forms = malloc(0); /* init the forms table */
nnt_primitives = malloc(0); /* init the primitives table */
nnt_rngs = time(NULL); xorshift64(); /* init the PRNG */
nnt_rngs = time(NULL); xorshift64s(); /* init the PRNG */
nnt_regprimitive("ps", &prim_ps);
nnt_regprimitive("rc", &prim_rc);
nnt_regprimitive("rs", &prim_rs);