Passenger Posted August 23, 2019 Share Posted August 23, 2019 (edited) #include <math.h> #include <stdio.h> typedef unsigned __int64 uint64; #define TRUE 1 #define FALSE 0 #define INC 3 #define NEW 7 #define SEQUEL 9 class rnd64 { public: rnd64(void); ~rnd64(void); uint64 rnd(void); private: int prime_number(int); uint64 next(void); int status; uint64 dx; uint64 dy; uint64 end; uint64 x, y; uint64 R16A; uint64 R16B; uint64 Z[2]; uint64 increaseA; uint64 increaseB; }; rnd64::rnd64(void) { dx=0xfedca201L; dy=0x012357bfL; R16A=(uint64)1; R16B=(uint64)2; Z[0]=Z[1]=0x00; x=5; y=3; end=2; increaseA=0x012357bfL; increaseB=0xfedca201L; } rnd64::~rnd64(void) { } int rnd64::prime_number(int st) { if (st == INC) { x+=2; y=3; if (x>=(1<<16)) x=5; end=unsigned(sqrt(double(x)+0.25)); return SEQUEL; } else { if (!(x%y)) return FALSE; if ((y+=2)>end) return TRUE; return SEQUEL; } } inline uint64 uabs(uint64 &a, uint64 &b) { return a>b? a-b: b-a; } inline void swap(uint64 &a, uint64 &b) { uint64 c=a; a=b; b=c; } uint64 rnd64::next(void) { status=prime_number(NEW); if (status == TRUE) { increaseB-=increaseA; increaseA+=x; prime_number(INC); } else if (status == FALSE) { prime_number(INC); } R16A -= increaseA; increaseA-=dx; R16B += increaseB; increaseB+=dy; if (status==TRUE) swap(R16A, R16B); R16A += (R16A>>32)^(R16B<<32); R16B -= (R16A<<32)^(R16B>>32); return R16A^R16B; } uint64 rnd64::rnd(void) { uint64 p1=next(); if (status==TRUE) { uint64 a[2], b[2]; uint64 p2=next(); a[0]=b[0] = Z[0]; a[1]=b[1] = Z[1]; ++a[unsigned(p1%2)]; ++b[unsigned(p2%2)]; uint64 A=uabs(a[0], a[1]); uint64 B=uabs(b[0], b[1]); if (Z[0] == Z[1]) { if (unsigned(next()%2)) { A=1; B=0; } else { A=0; B=1; } } if (A < B) { ++Z[unsigned(p1%2)]; return p1; } else { ++Z[unsigned(p2%2)]; return p2; } } else { ++Z[unsigned(p1%2)]; return p1; } } void main(void) { rnd64 R; int st=0; uint64 bit[2]; bit[0]=bit[1]=0x00; for (;;) { uint64 P=R.rnd(); ++bit[unsigned(P%2)]; if (st==0 && bit[1]>bit[0]) { printf("%d", bit[0]>bit[1]? 1: 0); st=1; } else if (st==1 && bit[0]>bit[1]) { printf("%d", bit[0]>bit[1]? 1: 0); st=0; } } } Edited August 23, 2019 by Passenger Testing Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now