首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随机生成器从C到Java的移植?

随机生成器从C到Java的移植?
EN

Stack Overflow用户
提问于 2008-12-29 15:08:43
回答 5查看 24.6K关注 0票数 19

George Marsaglia写了一个非常优秀的随机数生成器,它非常快、简单,并且周期比Mersenne Twister高得多。下面是代码和描述:

good C random number generator

我想将CMWC4096代码移植到Java,但它使用了几个无符号的数据类型,所以我不确定如何正确地做到这一点。下面是完整的C代码:

代码语言:javascript
运行
复制
/* choose random initial c<809430660 and */
/* 4096 random 32-bit integers for Q[]   */
static unsigned long Q[4096],c=362436;

unsigned long CMWC4096(void) {
    unsigned long long t, a=18782LL;
    static unsigned long i=4095;
    unsigned long x,r=0xfffffffe;
    i = (i+1) & 4095;
    t = a*Q[i] + c;
    c = (t>>32);
    x = t + c;
    if (x < c) {
        x++;
        c++;
    }
    return (Q[i] = r - x);
}

任何人都可以将其移植到Java吗?当你只有带符号的数字时,这是如何工作的?

编辑:感谢大家的快速回答!对于前一亿个数字,这段java代码似乎产生了与C代码相同的结果。它比Java的java.util.Random快3倍。

代码语言:javascript
运行
复制
public class ComplimentaryMultiplyWithCarryRandom {

    /**
     * Choose 4096 random 32-bit integers
     */
    private long[] Q;

    /**
     * choose random initial c<809430660
     */
    private long c = 362436;

    private int i;

    public ComplimentaryMultiplyWithCarryRandom() {
        Random r = new Random(1);
        Q = new long[4096];

        // TODO initialize with real random 32bit values
        for (int i = 0; i < 4096; ++i) {
            long v = r.nextInt();
            v -= Integer.MIN_VALUE;
            Q[i] = v;
        }
        i = 4095;
    }

    int next() {
        i = (i + 1) & 4095;
        long t = 18782 * Q[i] + c;
        c = t >>> 32;
        long x = (t + c) & 0xffffffffL;
        if (x < c) {
            ++x;
            ++c;
        }

        long v = 0xfffffffeL - x;
        Q[i] = v;
        return (int) v;
    }
}
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/397867

复制
相关文章

相似问题

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