xorshift 0.1.3

Implementation of the high performance xoroshiro128+, xorshift128+, xorshift1024*, and splitmix64 pseudo random number generators.
Documentation
// Written by Alexander Stocko <as@coder.gg>
//
// To the extent possible under law, the author has dedicated all copyright
// and related and neighboring rights to this software to the public domain
// worldwide. This software is distributed without any warranty.
//
// See <LICENSE or http://creativecommons.org/publicdomain/zero/1.0/>

extern crate xorshift;

use xorshift::*;

pub fn iter_eq<I, J>(i: I, j: J) -> bool
    where I: IntoIterator,
          J: IntoIterator<Item = I::Item>,
          I::Item: Eq
{
    // make sure the iterators have equal length
    let mut i = i.into_iter();
    let mut j = j.into_iter();
    loop {
        match (i.next(), j.next()) {
            (Some(ref ei), Some(ref ej)) if ei == ej => {}
            (None, None) => return true,
            _ => return false,
        }
    }
}

#[test]
fn test_xorshift128_sm64_seed() {
    let seed: u64 = 1477779739382793006;
    let t_vals: Vec<u64> = vec![3734360756937350019,
                                5028964947479250132,
                                16375665863640395736,
                                2386892914202662210,
                                15199834089667825831,
                                17769497452517632314,
                                12680721629729812030,
                                15564531140416851055,
                                11097790028826869390,
                                8478402252556281388,
                                3938630131836463627,
                                13482979509801512434,
                                16826253285660065403,
                                16110278797893572156,
                                11536506513440789906,
                                7639752116656372922,
                                1046059652735550751,
                                11521404418567128807,
                                8529751223868693606,
                                12997998284187723322,
                                18322790657117269355,
                                18201999538031917662,
                                8634445242778461938,
                                8466277913022430845,
                                1885031811907404633,
                                2264739358779356253,
                                15094530947316096845,
                                18137559477068189932,
                                2537656743610107989,
                                5138871238406804931,
                                15183155499907296889,
                                11867367639895528720,
                                10562715032360782312,
                                16664395174510276263,
                                6997805435275293159,
                                16972921566667776634,
                                1074247737508005038,
                                13740693935060571294,
                                15816257217974485909,
                                4064315281268274790,
                                7629852493902720019,
                                12203064001556445231,
                                6322785606105448062,
                                13059284569762622579,
                                7165340459966923980,
                                11277658567464979261,
                                12727441884037292431,
                                4035144520916529304,
                                367719864125592010,
                                10625882457741862049];

    let mut sm: SplitMix64 = SeedableRng::from_seed(seed);
    let mut rng: Xorshift128 = Rand::rand(&mut sm);
    let vals = rng.gen_iter::<u64>().take(t_vals.len()).collect::<Vec<u64>>();
    assert!(iter_eq(t_vals, vals));
}


#[test]
fn test_xoroshiro128_sm64_seed() {
    let seed: u64 = 1477780064718404645;
    let t_vals: Vec<u64> = vec![161743971435277218,
                                12749638389516825946,
                                4146736784021417053,
                                11394733814739543922,
                                5919433169786178858,
                                4241863456358946179,
                                7153495629702943020,
                                6615420010493371247,
                                9952100663899464852,
                                14672847684171515009,
                                17113800272934008423,
                                16403311139858716934,
                                12215484346000886377,
                                14238806683115497214,
                                13910142693410592070,
                                7724144857223886361,
                                9075733398169617904,
                                5634930714536464900,
                                2733942052901160118,
                                17693715793714424022,
                                8137122508671055182,
                                6415747618330055320,
                                15705975534504365925,
                                5868048410449252447,
                                9108959133630137736,
                                7483243276722213562,
                                14868796904872558029,
                                6313023836281617677,
                                6649336199478439294,
                                16149102996888215516,
                                3727991758618490683,
                                2320694756706062361,
                                12162126961292846971,
                                15484054774226706687,
                                16851698291513424180,
                                6211763121824466039,
                                1443411643584089856,
                                11814931554953919683,
                                1229846429463909320,
                                834914031011571225,
                                13014431014741371058,
                                5432524950931051905,
                                8352162180100044457,
                                4423136763541234055,
                                12211563008565317702,
                                10719456616463860877,
                                2097044165121537405,
                                10275641484510235258,
                                1951146658863428296,
                                9961210433054140615];

    let mut sm: SplitMix64 = SeedableRng::from_seed(seed);
    let mut rng: Xoroshiro128 = Rand::rand(&mut sm);
    let vals = rng.gen_iter::<u64>().take(t_vals.len()).collect::<Vec<u64>>();
    assert!(iter_eq(t_vals, vals));
}

#[test]
fn test_xorshift1024_sm64_seed() {
    let seed: u64 = 1477780182365762752;
    let t_vals: Vec<u64> = vec![7318853836271591753,
                                9274623446119407168,
                                7680446314077579600,
                                17082585102123344681,
                                17137567043538026650,
                                7937722105151092774,
                                11116912673301324510,
                                11068800607127969389,
                                6297635292564734785,
                                13519641119573099720,
                                12130373279879659717,
                                14360720272095099140,
                                6871195285874576390,
                                3810992938594941976,
                                702052121116926886,
                                9924167817777718969,
                                11779260473802976832,
                                6704443352799728691,
                                8135383811252218836,
                                8895372961824568755,
                                10286073723938788972,
                                7092470943059603460,
                                7965246990187368385,
                                7210101736085100830,
                                12609608380247765674,
                                16734156809779408751,
                                17685015894048411994,
                                12967080891160409700,
                                8206358809489724725,
                                15710959248597008897,
                                7891602991951624915,
                                13522388770433915878,
                                13885329677457736606,
                                5437216125826981154,
                                5828187362897965181,
                                1826814258047946771,
                                101076847761330219,
                                13722996303463886065,
                                8903413737919218637,
                                10036164134225207667,
                                10110544340826414078,
                                11616405843100478553,
                                11290966342014554162,
                                3279405133651105250,
                                18129332858809600283,
                                3842465837554359418,
                                6716889316224152410,
                                13315990744358110323,
                                8582117804084448577,
                                7011339168466747000];

    let mut sm: SplitMix64 = SeedableRng::from_seed(seed);
    let mut rng: Xorshift1024 = Rand::rand(&mut sm);
    let vals = rng.gen_iter::<u64>().take(t_vals.len()).collect::<Vec<u64>>();
    assert!(iter_eq(t_vals, vals));
}


#[test]
fn test_xoroshiro128_sm64_seed_jumps() {
    let seed: u64 = 1477780685585184119;
    let t_vals: Vec<u64> = vec![7363123556067731325,
                                11743806326703499081,
                                11017078471850861282,
                                6537481313430306491,
                                1734032112987717604,
                                5180571021312121954,
                                3442966274224547762,
                                4094090387771775361,
                                18054519279123885422,
                                14557847324980967237,
                                6042207721959556892,
                                16758864894686705829,
                                11096095272679097818,
                                880786699494201485,
                                15328614793127720471,
                                13892737921325360346,
                                8325147650871463291,
                                3991156015381259310,
                                18068907175194483049,
                                15416978590692154546,
                                6957056196276506653,
                                15485008903412937461,
                                13150412147600451329,
                                6145842285392582846,
                                16515019917555447020,
                                256586483171449133,
                                2718459902581448649,
                                7091617294121361198,
                                15206544481892958765,
                                1270439699417559690,
                                1319940446266325114,
                                6237439622392080613,
                                5207717649918826118,
                                84863475645399540,
                                1345811548000146967,
                                14567228697863434988,
                                8287116353595203179,
                                2107959157140947859,
                                12171276951494883762,
                                9800690783379362250,
                                5826182796358441966,
                                351365107720279578,
                                3763752402021015792,
                                4377946622975149565,
                                17065932569806129746,
                                2246497116407309970,
                                5850190023311132789,
                                13588387146044389660,
                                8821738610530612520,
                                5335768027764772758];

    let mut sm: SplitMix64 = SeedableRng::from_seed(seed);
    let mut rng: Xoroshiro128 = Rand::rand(&mut sm);
    rng.jump(10);
    let vals = rng.gen_iter::<u64>().take(t_vals.len()).collect::<Vec<u64>>();
    assert!(iter_eq(t_vals, vals));
}


#[test]
fn test_xorshift128_sm64_seed_jumps() {
    let seed: u64 = 1477780566345517426;
    let t_vals: Vec<u64> = vec![2898780227817592423,
                                10564003588519681288,
                                706169223508926661,
                                1726443879602479250,
                                9041239627918582700,
                                10042685306192430429,
                                15768972254883352514,
                                13263823228969469744,
                                17926358763063352546,
                                13485994777585816850,
                                559214318267761349,
                                13313816255709747081,
                                17524698450055253856,
                                7845726734300964129,
                                5267282915185541245,
                                7971132292829859275,
                                3331933060917754104,
                                10421958752966785644,
                                11828376425040553548,
                                7326508797291016532,
                                11233478458425605513,
                                14078266831421792009,
                                10110661748467841769,
                                3996513174299922950,
                                10764203498239380000,
                                11769497334896944465,
                                1578817649812051582,
                                12929521433805796527,
                                15209031551089675233,
                                9523182755265117704,
                                16359629716668803956,
                                9411167641273213463,
                                7151370879523844722,
                                11142304699119152166,
                                3523804126707148015,
                                2986061397992491393,
                                10445655305803481495,
                                16523509630980497064,
                                9784407109778557434,
                                8528249408899799560,
                                11984302998692256168,
                                3114038835576107181,
                                10003252390839736535,
                                9635779149713501666,
                                9361642498977356313,
                                109383826312025047,
                                6573228195939632801,
                                6348339904240198135,
                                12688408626692700841,
                                1374630186161923550];

    let mut sm: SplitMix64 = SeedableRng::from_seed(seed);
    let mut rng: Xorshift128 = Rand::rand(&mut sm);
    rng.jump(10);
    let vals = rng.gen_iter::<u64>().take(t_vals.len()).collect::<Vec<u64>>();
    assert!(iter_eq(t_vals, vals));
}


#[test]
fn test_xorshift1024_sm64_seed_jumps() {
    let seed: u64 = 1477780352127933297;
    let t_vals: Vec<u64> = vec![17641988979641603474,
                                4847548182235977104,
                                17137928101850435504,
                                4842480085416740988,
                                13172406546208354925,
                                13101965437943000717,
                                16588559302924825448,
                                14136610242086978942,
                                7111662841222420609,
                                9009248264141451009,
                                14350130973774676344,
                                2903269128173847592,
                                11456652620197842681,
                                14026681682938136654,
                                17225824107635646499,
                                17816440587602666832,
                                11006456248319870885,
                                10239434151017996415,
                                4452514510721243157,
                                2266999289835825184,
                                12824011692338984914,
                                16011958552421346244,
                                9828552592983939148,
                                6484325738934960683,
                                2164862324844719879,
                                9281647739458560697,
                                1335525705301323595,
                                12206882149301317038,
                                2517682921753729831,
                                15501501099127606764,
                                15065197524490801724,
                                4043690309651605218,
                                12565795083143911598,
                                17615628902989541138,
                                15924637082729135978,
                                17923079888512491966,
                                3924685391800452966,
                                11341097787088360407,
                                3565215538960722114,
                                10612533478339550159,
                                4042832868931920712,
                                9392072675245242469,
                                10774252430134360305,
                                6229194964116808556,
                                7190764606554748082,
                                17799074144192675038,
                                2440282438332276260,
                                3831136930614945258,
                                7073407240019580288,
                                544911792544382917];

    let mut sm: SplitMix64 = SeedableRng::from_seed(seed);
    let mut rng: Xorshift1024 = Rand::rand(&mut sm);
    rng.jump(10);
    let vals = rng.gen_iter::<u64>().take(t_vals.len()).collect::<Vec<u64>>();
    assert!(iter_eq(t_vals, vals));
}