我正在编写两个随机游走程序,一个使用Java API Math.random() (运行良好),另一个使用LCG,但范围为8的LCG只返回偶数(2、4、6和8)。
我以前从来没有尝试过制作我自己的LCG,我的a和c的值来自于维基百科的一篇文章,如果这些是问题,并且有人有好的方法为a和c提供好的值,那就太好了。对于种子,我使用System.nanoTime()。
我也尝试了从维基百科上找到的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,但它只能输出偶数。
发布于 2019-09-25 10:33:33
感谢大家的评论,我设法让它使用一个序列,并为我的系统找到了a和c的工作值,只使用System.nanoTime()来获得初始种子,然后使用函数的输出来获得未来的种子。
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),最终导致我的“随机漫步”走在一个圆圈中,并以非常清晰的模式行走。
https://stackoverflow.com/questions/58089998
复制相似问题