Xoroshiro128+
xoroshiro128+ (uppkallad efter dess operationer: XOR, rotate, shift, rotate) är en pseudoslumptalsgenerator avsedd som en efterföljare till xorshift+ . Istället för att vidmakthålla Marsaglias tradition av xorshift som en grundläggande operation, använder xoroshiro128+ en shift/rotate-baserad linjär transformation designad av Sebastiano Vigna i samarbete med David Blackman. Resultatet är en betydande förbättring av hastighet och statistisk kvalitet.
Statistisk kvalitet
De lägsta bitarna av utdata som genereras av xoroshiro128+ har låg kvalitet. Författarna till xoroshiro128+ erkänner att det inte klarar alla statistiska tester, med angivande av
Detta är xoroshiro128+ 1.0, vår bästa och snabbaste småtillståndsgenerator för flyttal. Vi föreslår att du använder dess övre bitar för flyttalsgenerering, eftersom det är något snabbare än xoroshiro128**. Den klarar alla tester vi känner till förutom de fyra lägre bitarna, som kan misslyckas med linjäritetstester (och bara de), så om låg linjär komplexitet inte anses vara ett problem (som det vanligtvis är fallet) kan den användas för att generera 64-bitars utgångar också; dessutom har den här generatorn ett mycket mildt Hamming-viktsberoende vilket gör att vårt test ( http://prng.di.unimi.it/hwd.php ) misslyckas efter 5 TB utgång; vi tror att denna lätta bias inte kan påverka någon applikation. Om du är orolig, använd xoroshiro128** eller xoshiro256+.
Vi föreslår att du använder ett teckentest för att extrahera ett slumpmässigt booleskt värde och skiftar åt höger för att extrahera delmängder av bitar.
Staten måste seedas så att den inte är noll överallt. Om du har en 64-bitars seed, föreslår vi att du sådd en splitmix64-generator och använder dess utdata för att fylla s.
OBS: parametrarna (a=24, b=16, c=37) för denna version ger något
bättre resultat i vårt test än 2016 års version (a=55, b=14, c=36).
Dessa påståenden om att inte klara tester kan bekräftas genom att köra PractRand på ingången, vilket resulterar i utdata som visas nedan:
RNG_test med PractRand version 0.93 RNG = RNG_stdin64, seed = 0xfac83126 testuppsättning = normal, foldning = standard (64 bitar) rng=RNG_stdin64, seed=0xfac83126 längd= 128 megabyte (2^27 byte), sekunds process= 2 Namn Raw1. Utvärdering [Låg1/64]BRank(12):256(2) R= +3748 p~= 3e-1129 FAIL !!!!!!!! [Låg1/64]BRank(12):384(1) R= +5405 p~= 3e-1628 FAIL !!!!!!!! ...och 146 testresultat utan anomalier
Att erkänna författarna fortsätter med att säga:
Vi föreslår att du använder ett teckentest för att extrahera ett slumpmässigt booleskt värde
Därför bör programmerare föredra de högsta bitarna (t.ex. att skapa ett heads/tails genom att skriva random_number < 0
snarare än random_number & 1
). Det måste dock noteras att samma test är underkänt av vissa instanser av Mersenne Twister och WELL .
De statistiska problemen sträcker sig långt bortom de nedersta bitarna, eftersom den inte klarar PractRand-testet även när den är trunkerad och misslyckas med flera tester i BigCrush även när bitarna är omvända.
Citat
David Meister, som implementerade det i Clojure , gjorde några värdefulla uttalanden:
"Detta är en clojure-implementering av xoroshiro128+ PRNG som beskrivs på http://xoroshiro.di.unimi.it . Algoritmen har visat sig vara snabb och producera överlägsna statistiska resultat jämfört med många PRNG:er som levereras med språk, inklusive Java. De statistiska resultaten har verifierats i både PractRand och TestU01 av författarna. xoroshiro128+ är utformad för att vara efterföljaren till xorshift128+, som för närvarande används i JavaScript-motorerna i Chrome, Firefox och Safari. Både xorshift128+ och xoroshiro128+ har en period på 2 128 men xoroshiro128+ är benchmarkerad av författarna som 20 % snabbare och med 20 % färre misslyckanden i BigCrush än sin föregångare."
Matt Gallagher drog i sin studie om slumptalsgeneratorer i Swift följande slutsats:
Det ser ut som att Xoroshiro är den bästa allmänna algoritmen som finns tillgänglig för närvarande. Lågt minne (bara 128 bitars lagring), extremt hög prestanda (1,2 nanosekunder per 64-bitars nummer, efter subtrahering av baslinjeoverhead) och mycket väl fördelat (som slår andra algoritmer i en rad automatiserade tester). Mersenne Twister kan fortfarande vara ett bättre val för mycket konservativa projekt som inte är villiga att byta till en sådan ny algoritm, men den nuvarande generationen av statistiskt testade algoritmer ger en baslinje av säkerhet från början som tidigare generationer saknade.
Relaterade generatorer
- xoroshiro128** förhindrar linjära artefakter i de låga bitarna
- xoshiro256+ har 256 tillståndsbitar vilket möjliggör mer parallellitet
- xoshiro256** — "vår allround, stensäker generator"
Generatorerna som slutar med + har svaga låga bitar, så de rekommenderas för generering av flyttalsnummer, med endast de 53 mest signifikanta bitarna.
Se även
- ^ Blackman, David; Vigna, Sebastiano (2018). "Skrypterade linjära pseudoslumpgeneratorer". arXiv : 1805.01407 [ cs.DS ].
- ^ a b Blackman, David; Vigna, Sebastiano (2018). "Original C-källkodsimplementering av xoroshiro128+" . Hämtad 4 maj 2018 .
- ^ "xoroshiro misslyckas med PractRand när den trunkeras" . 2020 . Hämtad 30 december 2020 .
- ^ "Xorshift128+ slumptalsgeneratorn misslyckas med BigCrush" . 2020 . Hämtad 30 december 2020 .
- ^ Meister, David (1 augusti 2016). "Clojure-implementering av xoroshiro128+ PRNG som beskrivs på webbplatsen xoroshiro.di.unimi.it" . github.com . Hämtad 2 november 2016 .
- ^ Gallagher, Matt (19 maj 2016). "Slumptalsgeneratorer i Swift" . www.cocoawithlove.com . Hämtad 2 november 2016 .
externa länkar
- Vigna, Sebastiano (2018). "xoshiro / xoroshiro generatorer och PRNG shootout" . Hämtad 2018-05-04 .