逻辑错误帮助:LCG仅返回偶数值

问题描述 投票:0回答:1

我正在制作两个随机游走程序,一个使用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的数字,但它只能输出偶数。

java random
1个回答
0
投票

谢谢大家的评论,我设法使它使用一个序列,并为我的系统找到了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),最终导致我的“随机游走”盘旋并以清晰的图案行走。

© www.soinside.com 2019 - 2024. All rights reserved.