rename references
This commit is contained in:
@ -0,0 +1,49 @@
|
||||
package minesweeper.random;
|
||||
|
||||
public class DefaultRNG {
|
||||
|
||||
static private Class<? extends RNG> defaultRNG = RNGJava.class;
|
||||
|
||||
|
||||
/**
|
||||
* Set the default RNG implementation used when creating the mine sweeper boards
|
||||
* @param rngClass
|
||||
*/
|
||||
public static void setDefaultRNGClass(Class<? extends RNG> rngClass) {
|
||||
defaultRNG = rngClass;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the default RNG implementation used when creating the mine sweeper boards
|
||||
* @param rngClass
|
||||
*/
|
||||
public static Class<? extends RNG> getDefaultRNGClass() {
|
||||
return defaultRNG;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an instance of the default random number generator with seed
|
||||
* @return
|
||||
*/
|
||||
public static RNG getRNG(long seed) {
|
||||
|
||||
RNG rng = null;
|
||||
try {
|
||||
rng = defaultRNG.newInstance();
|
||||
rng.seed(seed);
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return rng;
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package minesweeper.random;
|
||||
|
||||
public interface RNG {
|
||||
|
||||
public void seed(long seed);
|
||||
|
||||
public long random(int in);
|
||||
|
||||
public String name();
|
||||
|
||||
public String shortname();
|
||||
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package minesweeper.random;
|
||||
|
||||
|
||||
public class RNGJSF implements RNG {
|
||||
|
||||
|
||||
private int[] s;
|
||||
|
||||
public RNGJSF() {
|
||||
}
|
||||
|
||||
public RNGJSF(long seed) {
|
||||
seed(seed);
|
||||
}
|
||||
|
||||
public void seed(long seed) {
|
||||
|
||||
int seed1 = (int) Math.abs(seed);
|
||||
int seed2 = (int) ((Math.abs(seed) >>> 32) & 0x001FFFFFl);
|
||||
|
||||
//System.out.println(seed1 + " " + seed2);
|
||||
|
||||
s = new int[] {0xf1ea5eed, seed1, seed2, seed1};
|
||||
for (int i = 0; i < 20; i++) random(1);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public long random(int in) {
|
||||
|
||||
int e = s[0] - (s[1] << 27 | s[1] >>> 5);
|
||||
|
||||
s[0] = s[1] ^ (s[2] << 17 | s[2] >>> 15);
|
||||
s[1] = s[2] + s[3];
|
||||
s[2] = s[3] + e;
|
||||
s[3] = s[0] + e;
|
||||
|
||||
//System.out.println(e + " " + s[0] + " " + s[1] + " " + s[2] + " " + s[3]);
|
||||
|
||||
return ((s[3] & 0xFFFFFFFFl) * in) >>> 32;
|
||||
|
||||
}
|
||||
|
||||
private long bit32(long x) {
|
||||
return x & 0xFFFFFFFFl;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "JSF random numbers";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String shortname() {
|
||||
return "JSF";
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package minesweeper.random;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class RNGJava implements RNG {
|
||||
|
||||
static String shortName = "Java RNG";
|
||||
|
||||
private Random rng = new Random();
|
||||
|
||||
public RNGJava() {
|
||||
}
|
||||
|
||||
public RNGJava(long seed) {
|
||||
seed(seed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seed(long seed) {
|
||||
rng = new Random(seed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long random(int in) {
|
||||
|
||||
if (in == 0) {
|
||||
return rng.nextLong();
|
||||
} else {
|
||||
return rng.nextInt(in);
|
||||
}
|
||||
//return (long) Math.floor(rng.nextDouble() * in);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "Standard Java random numbers";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String shortname() {
|
||||
return "Java RNG";
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,71 @@
|
||||
package minesweeper.random;
|
||||
|
||||
|
||||
public class RNGKiss64 implements RNG {
|
||||
|
||||
|
||||
private long kiss64_x = 1234567890987654321l;
|
||||
private long kiss64_c = 123456123456123456l;
|
||||
private long kiss64_y = 362436362436362436l;
|
||||
private long kiss64_z = 1066149217761810l;
|
||||
private long kiss64_t = 0;
|
||||
|
||||
public RNGKiss64() {
|
||||
}
|
||||
|
||||
public RNGKiss64(long seed) {
|
||||
seed(seed);
|
||||
}
|
||||
|
||||
public void seed(long seed) {
|
||||
|
||||
kiss64_x = seed | 1;
|
||||
kiss64_c = seed | 2;
|
||||
kiss64_y = seed | 4;
|
||||
kiss64_z = seed | 8;
|
||||
kiss64_t = 0;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public long random(int in) {
|
||||
|
||||
// multiply with carry
|
||||
kiss64_t = (kiss64_x << 58) + kiss64_c;
|
||||
kiss64_c = (kiss64_x >>> 6); // unsigned right shift
|
||||
kiss64_x += kiss64_t;
|
||||
|
||||
|
||||
//kiss64_c += (kiss64_x < kiss64_t)?1l:0l;
|
||||
|
||||
kiss64_c += Long.compareUnsigned(kiss64_x, kiss64_t) < 0 ? 1l:0l;
|
||||
|
||||
// XOR shift
|
||||
kiss64_y ^= (kiss64_y << 13);
|
||||
kiss64_y ^= (kiss64_y >>> 17); // unsigned right shift
|
||||
kiss64_y ^= (kiss64_y << 43);
|
||||
|
||||
// Congruential
|
||||
kiss64_z = 6906969069l * kiss64_z + 1234567l;
|
||||
long rand = kiss64_x + kiss64_y + kiss64_z;
|
||||
|
||||
if (in == 0) {
|
||||
return rand;
|
||||
} else {
|
||||
return ((rand & 0xFFFFFFFFl) * in) >>> 32; // unsigned right shift;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "KISS64 random numbers";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String shortname() {
|
||||
return "KISS64";
|
||||
}
|
||||
|
||||
|
||||
}
|
Reference in New Issue
Block a user