我正在制作两个随机游走程序,一个使用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/

10-12 05:20