# XCOM: Enemy Unknown Pseudo Random Number Generator # Yawning Angel require(bitops) # http://cran.r-project.org/web/packages/bitops/index.html xcomPrng <- function(numResults = 1) { rval <- rep(NA, numResults) # Use R's Mersenne Twister implementation to seed the PRNG. seed <- floor(runif(1,0, 0xFFFFFFFF)) for(i in 1:numResults) { seed <- (seed * 0x0BB38435 + 0x0361936B) %% (2^32) # Replicate what the C algorithm does to create a floating # point number. Note that this looks slightly different # from the disassembled implementation due to porting. tmp <- bitOr(bitAnd(seed, 0x7FFFFF), 0x3F800000) exponent <- bitShiftR(tmp, 23) mantissa <- bitAnd(seed, 0x7FFFFF) rval[i] <- (mantissa / 2^(23)) * 2^(exponent - 127) } return(rval) }