bcd32: PRNG mit 32bit Output und sehr guter uniformer Distribution

13/10/2015 - 23:36 von Karl-Uwe Frank | Report spam
Der folgende Algorithmus von bcd32 besteht alle statistischen Tests für
PRNG wie, Qualcomms's bias test, John Walker's ENT, Maurer's Universal
test for random bits, zeigt eine gute uniforme Distribution nach Winston
Rayburn's bit analysis und besteht alle Tests von Pierre L'Ecuyer
TestU01, also SmallCrush, Crush und BigCrush.

Der Algorithmus verwendet nur schlichte Operationen wie XOR, Addition
und Bit Shifting.

//

// The Seeding Function
void seed_bcd32(uint32_t seed[]) {
a = seed[0] ^ 0xffffffff;
b = seed[1];
c = seed[2];
d = seed[3];

t = a + b + c + d;
}

// The PRNG Function
uint32_t bcd32() {
a = a + (d >> 5);
b = a + (b ^ c);
c = a + (b << 13);
d = a + (d ^ t);
t = a + t;

return (b ^ c ^ d);
}

//

Source Code und Test-Routinen liegen hier zum Download

http://www.freecx.co.uk/bcd32/

Cheers,
Karl-Uwe

news://freenews.netfront.net/ - complaints: news@netfront.net
 

Lesen sie die antworten

#1 Karl-Uwe Frank
15/10/2015 - 00:30 | Warnen spam
Bob Harris hat hervorgehoben das ein User den bcd32 mit a=0xffffffff
seeded kann wodurch a=0 entsteht. Das kann nur mit einer weiteren
Abfrage in der seeding function verhindert werden.

// The Seeding Function
void seed_bcd32(uint32_t seed[]) {
if ((seed[0] < 0) || (seed[0] == 0xffffffff)) seed[0] = 1;

a = seed[0] ^ 0xffffffff;
b = seed[1];
c = seed[2];
d = seed[3];

t = a + b + c + d;
}

news://freenews.netfront.net/ - complaints:

Ähnliche fragen