我正在制作两个随机游走程序,一个使用Java API Math.random()(运行良好),另一个使用LCG,但是范围为8的LCG仅返回偶数(2、4、6和8)。
我以前从未尝试过自己制作LCG,并且我和a的值来自维基百科的文章,如果这是问题所在,并且有人可以用一种很好的方法为a和c提出好的值。对于种子,我正在使用System.nanoTime()
。
我还尝试了从Wikipedia中找到的a和c的其他值,并且只是输入随机数,但是这些值都不起作用,大多数返回2和6或4和8都不起作用。
public static int getLCGRandom(int randomRange) {
//For my uses randomRange is always 8
long a = 6364136223846793005L;
long c = 1442695040888963407L;
int number = (int) Math.abs(((System.nanoTime() * a + c) % randomRange)) + 1;
return number;
}
同样,我希望它能够输出任何1-8的数字,但它只能输出偶数。
最佳答案
谢谢大家的评论,我设法使它使用一个序列,并为我的系统找到了a和c的工作值,仅使用System.nanoTime()来获得INITIAL种子,然后将函数的输出用于以后的种子。
public static int getLCGRandom(int randomRange) {
long a = 5;
long c = 2;
int number = (int) Math.abs(((SeedList.oldSeed * a + c) % randomRange)) + 1;
SeedList.oldSeed = number;
return number;
}
static class SeedList {
static long oldSeed = System.nanoTime();
}
因此,这实际上并没有达到我的预期效果,因为它仅使用基于先前输出的序列,它仅重复相同的小循环(范围为8),最终导致我的“随机游走”转了一圈,以非常清晰的图案行走。
关于java - 逻辑错误帮助:LCG仅返回偶数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58089998/