// Copyright (c) the JPEG XL Project Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Adapted from https://github.com/vpxyz/xorshift/blob/master/xorshift128plus/
// (MIT-license)
pub struct Xorshift128Plus {
s0: [u64;
Self ::N],
s1: [u64;
Self ::N],
}
impl Xorshift128Plus {
pub const N: usize =
8 ;
pub fn new_with_seed(seed: u64) ->
Self {
let mut s0 = [
0 ;
Self ::N];
let mut s1 = [
0 ;
Self ::N];
s0[
0 ] =
Self ::split_mix_64(seed +
0 x9E3779B97F4A7C15);
s1[
0 ] =
Self ::split_mix_64(s0[
0 ]);
for i
in 1 ..
Self ::N {
s0[i] =
Self ::split_mix_64(s1[i -
1 ]);
s1[i] =
Self ::split_mix_64(s0[i]);
}
Self { s0, s1 }
}
pub fn new_with_seeds(seed1: u32, seed2: u32, seed3: u32, seed4: u32) ->
Self {
let mut s0 = [
0 ;
Self ::N];
let mut s1 = [
0 ;
Self ::N];
s0[
0 ] =
Self ::split_mix_64(
(((seed1
as u64) <<
32 ) + seed2
as u64).wrapping_add(
0 x9E3779B97F4A7C15),
);
s1[
0 ] =
Self ::split_mix_64(
(((seed3
as u64) <<
32 ) + seed4
as u64).wrapping_add(
0 x9E3779B97F4A7C15),
);
for i
in 1 ..
Self ::N {
s0[i] =
Self ::split_mix_64(s0[i -
1 ]);
s1[i] =
Self ::split_mix_64(s1[i -
1 ]);
}
Self { s0, s1 }
}
pub fn fill(&
mut self , random_bits: &
mut [
u64; Self ::N]) {
for ((s0, s1), random_bits) in self
.s0
.iter_mut()
.zip(self .s1.iter_mut())
.zip(random_bits.iter_mut())
{
let mut new_s1 = *s0;
*s0 = *s1;
let bits = new_s1.wrapping_add(*s0); // b, c
new_s1 ^= new_s1 << 23 ;
*random_bits = bits;
new_s1 ^= *s0 ^ (new_s1 >> 18 ) ^ (*s0 >> 5 );
*s1 = new_s1;
}
}
fn split_mix_64(mut z: u64) -> u64 {
z = (z ^ (z >> 30 )).wrapping_mul(0 xBF58476D1CE4E5B9);
z = (z ^ (z >> 27 )).wrapping_mul(0 x94D049BB133111EB);
z ^ (z >> 31 )
}
}
#[ cfg(test)]
mod test {
use crate ::util::xorshift128plus::Xorshift128Plus;
#[ test]
fn xorshift128plus_golden() {
const NUM_VECTORS: usize = 64 ;
const EXPECTED: [[u64; Xorshift128Plus::N]; NUM_VECTORS] = [
[
0 x6E901576D477CBB1,
0 xE9E53789195DA2A2,
0 xB681F6DDA5E0AE99,
0 x8EFD18CE21FD6896,
0 xA898A80DF75CF532,
0 x50CEB2C9E2DE7E32,
0 x3CA7C2FEB25C0DD0,
0 xA4D0866B80B4D836,
],
[
0 x8CD6A1E6233D3A26,
0 x3D4603ADE98B112D,
0 xDC427AF674019E36,
0 xE28B4D230705AC53,
0 x7297E9BBA88783DD,
0 x34D3D23CFCD9B41A,
0 x5A223615ADBE96B8,
0 xE5EB529027CFBD01,
],
[
0 xC1894CF00DFAC6A2,
0 x18EDF8AE9085E404,
0 x8E936625296B4CCD,
0 x31971EF3A14A899B,
0 xBE87535FCE0BF26A,
0 x576F7A752BC6649F,
0 xA44CBADCE0C6B937,
0 x3DBA819BB17A353A,
],
[
0 x27CE38DFCC1C5EB6,
0 x920BEB5606340256,
0 x3986CBC40C9AFC2C,
0 xE22BCB3EEB1E191E,
0 x6E1FCDD3602A8FBA,
0 x052CB044E5415A29,
0 x46266646EFB9ECD7,
0 x8F44914618D29335,
],
[
0 xDD30AEDF72A362C5,
0 xBC1D824E16BB98F4,
0 x9EA6009C2AA3D2F1,
0 xF65C0FBBE17AF081,
0 x22424D06A8738991,
0 x8A62763F2B7611D2,
0 x2F3E89F722637939,
0 x84D338BEF50AFD50,
],
[
0 x00F46494898E2B0B,
0 x81239DC4FB8E8003,
0 x414AD93EC5773FE7,
0 x791473C450E4110F,
0 x87F127BF68C959AC,
0 x6429282D695EF67B,
0 x661082E11546CBA8,
0 x5815D53FA5436BFD,
],
[
0 xB3DEADAB9BE6E0F9,
0 xAA1B7B8F7CED0202,
0 x4C5ED437699D279E,
0 xA4471727F1CB39D3,
0 xE439DA193F802F70,
0 xF89401BB04FA6493,
0 x3B08045A4FE898BA,
0 x32137BFE98227950,
],
[
0 xFBAE4A092897FEF3,
0 x0639F6CE56E71C8E,
0 xF0AD6465C07F0C1E,
0 xFF8E28563361DCE5,
0 xC2013DB7F86BC6B9,
0 x8EFCC0503330102F,
0 x3F6B767EA5C4DA40,
0 xB9864B950B2232E1,
],
[
0 x76EB58DE8E5EC22A,
0 x9BBBF49A18B32F4F,
0 xC8405F02B2B2FAB9,
0 xC3E122A5F146BC34,
0 xC90BB046660F5765,
0 xB933981310DBECCF,
0 x5A2A7BFC9126FD1C,
0 x8BB388C94DF87901,
],
[
0 x753EB89AD63EF3C3,
0 xF24AAF40C89D65AD,
0 x23F68931C1A6AA6D,
0 xF47E79BF702C6DD0,
0 xA3AD113244EE7EAE,
0 xD42CBEA28F793DC3,
0 xD896FCF1820F497C,
0 x042B86D2818948C1,
],
[
0 x8F2A4FC5A4265763,
0 xEC499E6F95EAA10C,
0 xE3786D4ECCD0DEB5,
0 xC725C53D3AC4CC43,
0 x065A4ACBBF83610E,
0 x35C61C9FEF167129,
0 x7B720AEAA7D70048,
0 x14206B841377D039,
],
[
0 xAD27D78BF96055F6,
0 x5F43B20FF47ADCD4,
0 xE184C2401E2BF71E,
0 x30B263D78990045D,
0 xC22F00EBFF9BA201,
0 xAE7F86522B53A562,
0 x2853312BC039F0A4,
0 x868D619E6549C3C8,
],
[
0 xFD5493D8AE9A8371,
0 x773D5E224DF61B3B,
0 x5377C54FBB1A8280,
0 xCAD4DE3B8265CAFA,
0 xCDF3F19C91EBD5F6,
0 xC8EA0F182D73BD78,
0 x220502D593433FF1,
0 xB81205E612DC31B1,
],
[
0 x8F32A39EAEDA4C70,
0 x1D4B0914AA4DAC7F,
0 x56EF1570F3A8B405,
0 x29812CB17404A592,
0 x97A2AAF69CAE90F2,
0 x12BF5E02778BBFE5,
0 x9D4B55AD42A05FD2,
0 x06C2BAB5E6086620,
],
[
0 x8DB4B9648302B253,
0 xD756AD9E3AEA12C7,
0 x68709B7F11D4B188,
0 x7CC299DDCD707A4B,
0 x97B860C370A7661D,
0 xCECD314FC20E64F5,
0 x55F412CDFB4C7EC3,
0 x55EE97591193B525,
],
[
0 xCF70F3ACA96E6254,
0 x022FEDECA2E09F46,
0 x686823DB60AE1ECF,
0 xFD36190D3739830E,
0 x74E1C09027F68120,
0 xB5883A835C093842,
0 x93E1EFB927E9E4E3,
0 xB2721E249D7E5EBE,
],
[
0 x69B6E21C44188CB8,
0 x5D6CFB853655A7AA,
0 x3E001A0B425A66DC,
0 x8C57451103A5138F,
0 x7BF8B4BE18EAB402,
0 x494102EB8761A365,
0 xB33796A9F6A81F0E,
0 x10005AB3BCCFD960,
],
[
0 xB2CF25740AE965DC,
0 x6F7C1DF7EF53D670,
0 x648DD6087AC2251E,
0 x040955D9851D487D,
0 xBD550FC7E21A7F66,
0 x57408F484DEB3AB5,
0 x481E24C150B506C1,
0 x72C0C3EAF91A40D6,
],
[
0 x1997A481858A5D39,
0 x539718F4BEF50DC1,
0 x2EC4DC4787E7E368,
0 xFF1CE78879419845,
0 xE219A93DD6F6DD30,
0 x85328618D02FEC1A,
0 xC86E02D969181B20,
0 xEBEC8CD8BBA34E6E,
],
[
0 x28B55088A16CE947,
0 xDD25AC11E6350195,
0 xBD1F176694257B1C,
0 x09459CCF9FCC9402,
0 xF8047341E386C4E4,
0 x7E8E9A9AD984C6C0,
0 xA4661E95062AA092,
0 x70A9947005ED1152,
],
[
0 x4C01CF75DBE98CCD,
0 x0BA076CDFC7373B9,
0 x6C5E7A004B57FB59,
0 x336B82297FD3BC56,
0 x7990C0BE74E8D60F,
0 xF0275CC00EC5C8C8,
0 x6CF29E682DFAD2E9,
0 xFA4361524BD95D72,
],
[
0 x631D2A19FF62F018,
0 x41C43863B985B3FA,
0 xE052B2267038EFD9,
0 xE2A535FAC575F430,
0 xE004EEA90B1FF5B8,
0 x42DFE2CA692A1F26,
0 x90FB0BFC9A189ECC,
0 x4484102BD3536BD0,
],
[
0 xD027134E9ACCA5A5,
0 xBBAB4F966D476A9B,
0 x713794A96E03D693,
0 x9F6335E6B94CD44A,
0 xC5090C80E7471617,
0 x6D9C1B0C87B58E33,
0 x1969CE82E31185A5,
0 x2099B97E87754EBE,
],
[
0 x60EBAF4ED934350F,
0 xC26FBF0BA5E6ECFF,
0 x9E54150F0312EC57,
0 x0973B48364ED0041,
0 x800A523241426CFC,
0 x03AB5EC055F75989,
0 x8CF315935DEEB40A,
0 x83D3FC0190BD1409,
],
[
0 x26D35394CF720A51,
0 xCE9EAA15243CBAFE,
0 xE2B45FBAF21B29E0,
0 xDB92E98EDE73F9E0,
0 x79B16F5101C26387,
0 x1AC15959DE88C86F,
0 x387633AEC6D6A580,
0 xA6FC05807BFC5EB8,
],
[
0 x2D26C8E47C6BADA9,
0 x820E6EC832D52D73,
0 xB8432C3E0ED0EE5B,
0 x0F84B3C4063AAA87,
0 xF393E4366854F651,
0 x749E1B4D2366A567,
0 x805EACA43480D004,
0 x244EBF3AA54400A5,
],
[
0 xBFDC3763AA79F75A,
0 x9E3A74CC751F41DB,
0 xF401302A149DBC55,
0 x6B25F7973D7BF7BC,
0 x13371D34FDBC3DAE,
0 xC5E1998C8F484DCD,
0 x7031B8AE5C364464,
0 x3847F0C4F3DA2C25,
],
[
0 x24C6387D2C0F1225,
0 x77CCE960255C67A4,
0 x21A0947E497B10EB,
0 xBB5DB73A825A9D7E,
0 x26294A41999E553D,
0 x3953E0089F87D925,
0 x3DAE6E5D4E5EAAFE,
0 x74B545460341A7AA,
],
[
0 x710E5EB08A7DB820,
0 x7E43C4E77CAEA025,
0 xD4C91529C8B060C1,
0 x09AE26D8A7B0CA29,
0 xAB9F356BB360A772,
0 xB68834A25F19F6E9,
0 x79B8D9894C5734E2,
0 xC6847E7C8FFD265F,
],
[
0 x10C4BCB06A5111E6,
0 x57CB50955B6A2516,
0 xEF53C87798B6995F,
0 xAB38E15BBD8D0197,
0 xA51C6106EFF73C93,
0 x83D7F0E2270A7134,
0 x0923FD330397FCE5,
0 xF9DE54EDFE58FB45,
],
[
0 x07D44833ACCD1A94,
0 xAAD3C9E945E2F9F3,
0 xABF4C879B876AA37,
0 xF29C69A21B301619,
0 x2DDCE959111C788B,
0 x7CEDB48F8AC1729B,
0 x93F3BA9A02B659BE,
0 xF20A87FF17933CBE,
],
[
0 x8E96EBE93180CFE6,
0 x94CAA12873937079,
0 x05F613D9380D4189,
0 xBCAB40C1DC79F38A,
0 x0AD8907B7C61D19E,
0 x88534E189D103910,
0 x2DB2FAABA160AB8F,
0 xA070E7506B06F15C,
],
[
0 x6FB1FCDAFFEF87A9,
0 xE735CF25337A090D,
0 x172C6EDCEFEF1825,
0 x76957EA49EF0542D,
0 x819BF4CD250F7C49,
0 xD6FF23E4AD00C4D4,
0 xE79673C1EC358FF0,
0 xAC9C048144337938,
],
[
0 x4C5387FF258B3AF4,
0 xEDB68FAEC2CB1AA3,
0 x02A624E67B4E1DA4,
0 x5C44797A38E08AF2,
0 x36546A70E9411B4B,
0 x47C17B24D2FD9675,
0 x101957AAA020CA26,
0 x47A1619D4779F122,
],
[
0 xF84B8BCDC92D9A3C,
0 x951D7D2C74B3066B,
0 x7AC287C06EDDD9B2,
0 x4C38FC476608D38F,
0 x224D793B19CB4BCD,
0 x835A255899BF1A41,
0 x4AD250E9F62DB4AB,
0 xD9B44F4B58781096,
],
[
0 xABBAF99A8EB5C6B8,
0 xFB568E900D3A9F56,
0 x11EDF63D23C5DF11,
0 xA9C3011D3FA7C5A8,
0 xAEDD3CF11AFFF725,
0 xABCA472B5F1EDD6B,
0 x0600B6BB5D879804,
0 xDB4DE007F22191A0,
],
[
0 xD76CC9EFF0CE9392,
0 xF5E0A772B59BA49A,
0 x7D1AE1ED0C1261B5,
0 x79224A33B5EA4F4A,
0 x6DD825D80C40EA60,
0 x47FC8E747E51C953,
0 x695C05F72888BF98,
0 x1A012428440B9015,
],
[
0 xD754DD61F9B772BF,
0 xC4A2FCF4C0F9D4EB,
0 x461167CDF67A24A2,
0 x434748490EBCB9D4,
0 x274DD9CDCA5781DE,
0 x36BAC63BA9A85209,
0 x30324DAFDA36B70F,
0 x337570DB4FE6DAB3,
],
[
0 xF46CBDD57C551546,
0 x8E02507E676DA3E3,
0 xD826245A8C15406D,
0 xDFB38A5B71113B72,
0 x5EA38454C95B16B5,
0 x28C054FB87ABF3E1,
0 xAA2724C0BA1A8096,
0 xECA83EC980304F2F,
],
[
0 x6AA76EC294EB3303,
0 x42D4CDB2A8032E3B,
0 x7999EDF75DCD8735,
0 xB422BFFE696CCDCC,
0 x8F721461FD7CCDFE,
0 x148E1A5814FDE253,
0 x4DC941F4375EF8FF,
0 x27B2A9E0EB5B49CF,
],
[
0 xCEA592EF9343EBE1,
0 xF7D38B5FA7698903,
0 x6CCBF352203FEAB6,
0 x830F3095FCCDA9C5,
0 xDBEEF4B81B81C8F4,
0 x6D7EB9BCEECA5CF9,
0 xC58ABB0FBE436C69,
0 xE4B97E6DB2041A4B,
],
[
0 x7E40FC772978AF14,
0 xCDDA4BBAE28354A1,
0 xE4F993B832C32613,
0 xD3608093C68A4B35,
0 x9A3B60E01BEE3699,
0 x03BEF248F3288713,
0 x70B9294318F3E9B4,
0 x8D2ABB913B8610DE,
],
[
0 x37F209128E7D8B2C,
0 x81D2AB375BD874BC,
0 xA716A1B7373F7408,
0 x0CEE97BEC4706540,
0 xA40C5FD9CDBC1512,
0 x73CAF6C8918409E7,
0 x45E11BCEDF0BBAA1,
0 x612C612BFF6E6605,
],
[
0 xF8ECB14A12D0F649,
0 xDA683CD7C01BA1AC,
0 xA2203F7510E124C1,
0 x7F83E52E162F3C78,
0 x77D2BB73456ACADB,
0 x37FC34FC840BBA6F,
0 x3076BC7D4C6EBC1F,
0 x4F514123632B5FA9,
],
[
0 x44D789DED935E884,
0 xF8291591E09FEC9F,
0 xD9CED2CF32A2E4B7,
0 x95F70E1EB604904A,
0 xDE438FE43C14F6AB,
0 x4C8D23E4FAFCF8D8,
0 xC716910A3067EB86,
0 x3D6B7915315095D3,
],
[
0 x3170FDBADAB92095,
0 x8F1963933FC5650B,
0 x72F94F00ABECFEAB,
0 x6E3AE826C6AAB4CE,
0 xA677A2BF31068258,
0 x9660CDC4F363AF10,
0 xD81A15A152379EF1,
0 x5D7D285E1080A3F9,
],
[
0 xDAD5DDFF9A2249B3,
0 x6F9721D926103FAE,
0 x1418CBB83FFA349A,
0 xE71A30AD48C012B2,
0 xBE76376C63751132,
0 x3496467ACA713AE6,
0 x8D7EC01369F991A3,
0 xD8C73A88B96B154E,
],
[
0 x8B5D9C74AEB4833A,
0 xF914FB3F867B912F,
0 xB894EA034936B1DC,
0 x8A16D21BE51C4F5B,
0 x31FF048ED582D98E,
0 xB95AB2F4DC65B820,
0 x04082B9170561AF7,
0 xA215610A5DC836FA,
],
[
0 xB2ADE592C092FAAC,
0 x7A1E683BCBF13294,
0 xC7A4DBF86858C096,
0 x3A49940F97BFF316,
0 xCAE5C06B82C46703,
0 xC7F413A0F951E2BD,
0 x6665E7BB10EB5916,
0 x86F84A5A94EDE319,
],
[
0 x4EA199D8FAA79CA3,
0 xDFA26E5BF1981704,
0 x0F5E081D37FA4E01,
0 x9CB632F89CD675CD,
0 x4A09DB89D48C0304,
0 x88142742EA3C7672,
0 xAC4F149E6D2E9BDB,
0 x6D9E1C23F8B1C6C6,
],
[
0 xD58BE47B92DEC0E9,
0 x8E57573645E34328,
0 x4CC094CCB5FB5126,
0 x5F1D66AF6FB40E3C,
0 x2BA15509132D3B00,
0 x0D6545646120E567,
0 x3CF680C45C223666,
0 x96B28E32930179DA,
],
[
0 x5900C45853AC7990,
0 x61881E3E8B7FF169,
0 x4DE5F835DF2230FF,
0 x4427A9E7932F73FF,
0 x9B641BAD379A8C8D,
0 xDF271E5BF98F4E5C,
0 xDFDA16DB830FF5EE,
0 x371C7E7CFB89C0E9,
],
[
0 x4410A8576247A250,
0 x6AD2DA12B45AC0D9,
0 x18DFC72AAC85EECC,
0 x06FC8BB2A0EF25C8,
0 xEB287619C85E6118,
0 x19553ECA67F25A2C,
0 x3B9557F1DCEC5BAA,
0 x7BAD9E8B710D1079,
],
[
0 x34F365D66BD22B28,
0 xE6E124B9F10F835D,
0 x0573C38ABF2B24DC,
0 xD32E6AF10A0125AE,
0 x383590ACEA979519,
0 x8376ED7A39E28205,
0 xF0B7F184DCBDA435,
0 x062A203390E31794,
],
[
0 xA2AFFD7E41918760,
0 x7F90FC1BD0819C86,
0 x5033C08E5A969533,
0 x2707AF5C6D039590,
0 x57BBD5980F17DF9C,
0 xD3FE6E61D763268A,
0 x9E0A0AE40F335A3B,
0 x43CF4EB0A99613C5,
],
[
0 xD4D2A397CE1A7C2E,
0 x3DF7CE7CC3212DAD,
0 x0880F0D5D356C75A,
0 xA8AFC44DD03B1346,
0 x79263B46C13A29E0,
0 x11071B3C0ED58E7A,
0 xED46DC9F538406BF,
0 x2C94974F2B94843D,
],
[
0 xE246E13C39AB5D5E,
0 xAC1018489D955B20,
0 x8601B558771852B8,
0 x110BD4C06DB40173,
0 x738FC8A18CCA0EBB,
0 x6673E09BE0EA76E5,
0 x024BC7A0C7527877,
0 x45E6B4652E2EC34E,
],
[
0 xD1ED26A1A375CDC8,
0 xAABC4E896A617CB8,
0 x0A9C9E8E57D753C6,
0 xA3774A75FEB4C30E,
0 x30B816C01C93E49E,
0 xF405BABC06D2408C,
0 xCC0CE6B4CE788ABC,
0 x75E7922D0447956C,
],
[
0 xD07C1676A698BC95,
0 x5F9AEA4840E2D860,
0 xD5FC10D58BDF6F02,
0 xF190A2AD4BC2EEA7,
0 x0C24D11F51726931,
0 xDB646899A16B6512,
0 x7BC10670047B1DD8,
0 x2413A5ABCD45F092,
],
[
0 x4E66892190CFD923,
0 xF10162440365EC8E,
0 x158ACA5A6A2280AE,
0 x0D60ED11C0224166,
0 x7CD2E9A71B9D7488,
0 x450D7289706AB2A3,
0 x88FAE34EC9A0D7DC,
0 x96FF9103575A97DA,
],
[
0 x77990FAC6046C446,
0 xB174B5FB30C76676,
0 xE352CE3EB56CF82A,
0 xC6039B6873A9A082,
0 xE3F80F3AE333148A,
0 xB853BA24BA3539B9,
0 xE8863E52ECCB0C74,
0 x309B4CC1092CC245,
],
[
0 xBC2B70BEE8388D9F,
0 xE48D92AE22216DCE,
0 xF15F3BF3E2C15D8F,
0 x1DD964D4812D8B24,
0 xD56AF02FB4665E4C,
0 x98002200595BD9A3,
0 x049246D50BB8FA12,
0 x1B542DF485B579B9,
],
[
0 x2347409ADFA8E497,
0 x36015C2211D62498,
0 xE9F141F32EB82690,
0 x1F839912D0449FB9,
0 x4E4DCFFF2D02D97C,
0 xF8A03AB4C0F625C9,
0 x0605F575795DAC5C,
0 x4746C9BEA0DDA6B1,
],
[
0 xCA5BB519ECE7481B,
0 xFD496155E55CA945,
0 xF753B9DBB1515F81,
0 x50549E8BAC0F70E7,
0 x8614FB0271E21C60,
0 x60C72947EB0F0070,
0 xA6511C10AEE742B6,
0 x48FB48F2CACCB43E,
],
];
let mut rng = Xorshift128Plus::new_with_seed(12345 );
for expected_row in EXPECTED.iter() {
let mut row = [0 ; Xorshift128Plus::N];
rng.fill(&mut row);
for (&actual, &expected) in row.iter().zip(expected_row) {
assert_eq!(actual, expected);
}
}
}
}
Messung V0.5 in Prozent C=87 H=97 G=91
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-08-25)
¤
*© Formatika GbR, Deutschland