首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逻辑错误帮助: LCG仅返回偶数值

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

Stack Overflow用户
提问于 2019-09-25 09:29:09
回答 1查看 42关注 0票数 0

我正在编写两个随机游走程序,一个使用Java API Math.random() (运行良好),另一个使用LCG,但范围为8的LCG只返回偶数(2、4、6和8)。

我以前从来没有尝试过制作我自己的LCG,我的a和c的值来自于维基百科的一篇文章,如果这些是问题,并且有人有好的方法为a和c提供好的值,那就太好了。对于种子,我使用System.nanoTime()

我也尝试了从维基百科上找到的a和c的其他值,只是输入随机数字,但这些都不起作用,大多数只返回2和6或4和8。

代码语言:javascript
复制
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,但它只能输出偶数。

EN

回答 1

Stack Overflow用户

发布于 2019-09-25 10:33:33

感谢大家的评论,我设法让它使用一个序列,并为我的系统找到了a和c的工作值,只使用System.nanoTime()来获得初始种子,然后使用函数的输出来获得未来的种子。

代码语言:javascript
复制
    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),最终导致我的“随机漫步”走在一个圆圈中,并以非常清晰的模式行走。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58089998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档