Port de générateur Aléatoire de C à Java?

George Marsaglia a écrit un excellent générateur de nombre aléatoire qui est extrêmement rapide, simple, et a beaucoup plus de temps que le nombre de Mersenne Twister. Voici le code avec description:

bon C générateur de nombre aléatoire

Je voulais le port de l'CMWC4096 code Java, mais il utilise plusieurs types de données non signé, donc je ne suis pas sûr de savoir comment le faire correctement. Voici tout le code C:

/* 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);
}

Quelqu'un peut-port ce de Java? Comment cela fonctionne quand vous avez seulement des nombres signés disponibles?

EDIT: Merci à tous pour les réponses rapides! Pour la première tranche de 100 millions de numéros de code java semble produire le même résultat que le code C. Il est 3 fois plus rapide que Java est java.util.Aléatoire.

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;
    }
}

OriginalL'auteur martinus | 2008-12-29