#include <stdio.h>
#include <stdint.h>
typedef struct {
uint32_t low;
uint32_t high;
} twoint;
typedef struct {
twoint a;
twoint b;
} twostate;
uint64_t simple_lcg( uint64_t a, uint64_t c, uint64_t m, uint64_t x) {
return ( ( a * x) + c) % m;
}
uint64_t twoint_to_long( twoint num) {
void * something = ( void * ) & num;
uint64_t * result = ( uint64_t * ) something;
return * result;
}
twoint long_to_twoint( uint64_t num) {
void * something = ( void * ) & num;
twoint* result = ( twoint* ) something;
return * result;
}
uint64_t badRand( twostate* state) {
twoint num = { state-> a.low , state-> b.low } ;
return twoint_to_long( num) ;
}
uint64_t goodRand( twostate* state) {
twoint num = { state-> a.high , state-> b.high } ;
return twoint_to_long( num) ;
}
void lcg( twostate* state) {
#define ELCG(x) simple_lcg(0xABAD1DEA, 0xDEADBEEF, UINT64_MAX, x)
uint64_t na = ELCG( twoint_to_long( state-> a) ) ;
uint64_t nb = ELCG( twoint_to_long( state-> b) ) ;
state-> a = long_to_twoint( na) ;
state-> b = long_to_twoint( nb) ;
}
int main( int argc, char * argv[ ] )
{
twoint a = { 1 , 2 } ;
twoint b = { 3 , 4 } ;
twostate state = { a, b } ;
for ( int i = 0 ; i < 10 ; i++ ) {
lcg( & state) ;
printf ( "Good random, use it: %llu \n " , goodRand
( & state
) ) ; printf ( "Bad random, don't use it: %llu \n " , badRand
( & state
) ) ; }
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCnR5cGVkZWYgc3RydWN0IHsKCXVpbnQzMl90IGxvdzsKCXVpbnQzMl90IGhpZ2g7Cn0gdHdvaW50OwoKdHlwZWRlZiBzdHJ1Y3QgewoJdHdvaW50IGE7Cgl0d29pbnQgYjsKfSB0d29zdGF0ZTsKCnVpbnQ2NF90IHNpbXBsZV9sY2codWludDY0X3QgYSwgdWludDY0X3QgYywgdWludDY0X3QgbSwgdWludDY0X3QgeCkgewoJcmV0dXJuICgoYSAqIHgpICsgYykgJSBtOwp9Cgp1aW50NjRfdCB0d29pbnRfdG9fbG9uZyh0d29pbnQgbnVtKSB7Cgl2b2lkKiBzb21ldGhpbmcgPSAodm9pZCopJm51bTsKCXVpbnQ2NF90KiByZXN1bHQgPSAodWludDY0X3QqKXNvbWV0aGluZzsKCXJldHVybiAqcmVzdWx0Owp9Cgp0d29pbnQgbG9uZ190b190d29pbnQodWludDY0X3QgbnVtKSB7Cgl2b2lkKiBzb21ldGhpbmcgPSAodm9pZCopJm51bTsKCXR3b2ludCogcmVzdWx0ID0gKHR3b2ludCopc29tZXRoaW5nOwoJcmV0dXJuICpyZXN1bHQ7Cn0KCnVpbnQ2NF90IGJhZFJhbmQodHdvc3RhdGUqIHN0YXRlKSB7Cgl0d29pbnQgbnVtID0geyBzdGF0ZS0+YS5sb3csIHN0YXRlLT5iLmxvdyB9OwoJcmV0dXJuIHR3b2ludF90b19sb25nKG51bSk7Cn0KCnVpbnQ2NF90IGdvb2RSYW5kKHR3b3N0YXRlKiBzdGF0ZSkgewoJdHdvaW50IG51bSA9IHsgc3RhdGUtPmEuaGlnaCwgc3RhdGUtPmIuaGlnaCB9OwoJcmV0dXJuIHR3b2ludF90b19sb25nKG51bSk7Cn0KCnZvaWQgbGNnKHR3b3N0YXRlKiBzdGF0ZSkgewoJI2RlZmluZSBFTENHKHgpIHNpbXBsZV9sY2coMHhBQkFEMURFQSwgMHhERUFEQkVFRiwgVUlOVDY0X01BWCwgeCkKCXVpbnQ2NF90IG5hID0gRUxDRyh0d29pbnRfdG9fbG9uZyhzdGF0ZS0+YSkpOwoJdWludDY0X3QgbmIgPSBFTENHKHR3b2ludF90b19sb25nKHN0YXRlLT5iKSk7CgoJc3RhdGUtPmEgPSBsb25nX3RvX3R3b2ludChuYSk7CglzdGF0ZS0+YiA9IGxvbmdfdG9fdHdvaW50KG5iKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJdHdvaW50IGEgPSB7IDEsIDIgfTsKCXR3b2ludCBiID0geyAzLCA0IH07Cgl0d29zdGF0ZSBzdGF0ZSA9IHsgYSwgYiB9OwoKCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CgkJbGNnKCZzdGF0ZSk7CgkJcHJpbnRmKCJbJWRdXG4iLCBpICsgMSk7CgkJcHJpbnRmKCJHb29kIHJhbmRvbSwgdXNlIGl0OiAlbGx1IFxuIiwgZ29vZFJhbmQoJnN0YXRlKSk7CgkJcHJpbnRmKCJCYWQgcmFuZG9tLCBkb24ndCB1c2UgaXQ6ICVsbHUgXG4iLCBiYWRSYW5kKCZzdGF0ZSkpOwoJfQogICAgcmV0dXJuIDA7Cn0K
stdout
[1]
Good random, use it: 12588818431901055957
Bad random, don't use it: 16263932762948033753
[2]
Good random, use it: 2720803787676259017
Bad random, don't use it: 17143767895757894217
[3]
Good random, use it: 12088632693136085066
Bad random, don't use it: 14407287308702513833
[4]
Good random, use it: 8217024325019233430
Bad random, don't use it: 18211897777719673449
[5]
Good random, use it: 12656807529656163924
Bad random, don't use it: 14390778897813526505
[6]
Good random, use it: 5545660948545904246
Bad random, don't use it: 5636979963685338857
[7]
Good random, use it: 6623761171995285576
Bad random, don't use it: 14114388887445513449
[8]
Good random, use it: 1763128157691682133
Bad random, don't use it: 2473499746185830633
[9]
Good random, use it: 2959415399114682595
Bad random, don't use it: 8289452261783025897
[10]
Good random, use it: 1181416572144120035
Bad random, don't use it: 9640219887008884969