]> git.mdlowis.com Git - projs/tide.git/commitdiff
checked in qcheck with sample code for new prng
authorMichael D. Lowis <mike@mdlowis.com>
Mon, 11 Mar 2019 02:17:02 +0000 (22:17 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Mon, 11 Mar 2019 02:17:02 +0000 (22:17 -0400)
inc/qcheck.h

index 16fcfb7ed88e79a4510894c0480a88a2b881dea6..6146d29b01b8f0626a5cd72fc2aa0cb93ff70827 100644 (file)
@@ -37,6 +37,12 @@ typedef struct {
     QCValue** vals;
 } QCResult;
 
+typedef struct {
+    uint64_t state;
+    uint64_t mult;
+    uint64_t incr;
+} QCRand_t;
+
 typedef int (*QCProp)(int nvals, QCValue** vals);
 
 typedef QCValue* (*QCGenFn)(void);
@@ -103,6 +109,29 @@ QCValue* GenAsciiString(void);
 
 static int Seed = 0, NTrials = 1000;
 
+
+int myrand(rand_t* rand) {
+    uint64_t x = rand->state;
+    unsigned count = (unsigned)(x >> 59);
+    rand->state = x * rand->mult + rand->incr;
+    x ^= x >> 18;
+    x = (uint32_t)(x >> 27);
+    return (x >> count | x << (-count & 31));
+}
+
+void mysrand(rand_t* rand, uint64_t seed) {
+    rand->state = 0x4d595df4d0f33173;
+    rand->mult = 6364136223846793005u;
+    rand->incr = 1442695040888963407u;
+    if (seed) {
+        rand->state = seed + rand->incr;
+        (void)myrand(rand);
+    }
+}
+
+
+
+
 void qcinit(int seed) {
     Seed = (seed ? seed : time(NULL));
     srand(Seed);