//******************************************************************************
//
// File:    DefaultRandom.java
// Package: edu.rit.util
// Unit:    Class edu.rit.util.DefaultRandom
//
// This Java source file is copyright (C) 2008 by Alan Kaminsky. All rights
// reserved. For further information, contact the author, Alan Kaminsky, at
// ark@cs.rit.edu.
//
// This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
// software; you can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// PJ is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
// A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// A copy of the GNU General Public License is provided in the file gpl.txt. You
// may also obtain a copy of the GNU General Public License on the World Wide
// Web at http://www.gnu.org/licenses/gpl.html.
//
//******************************************************************************

package edu.rit.util;

/**
 * Class DefaultRandom provides a default pseudorandom number generator (PRNG)
 * designed for use in parallel scientific programming. To create an instance of
 * class DefaultRandom, either use the DefaultRandom() constructor, or
 * use the static getInstance(long) method in class {@linkplain
 * Random}.
 * 

* Class DefaultRandom generates random numbers by hashing successive counter * values. The seed initializes the counter. The hash function is defined in W. * Press et al., Numerical Recipes: The Art of Scientific Computing, Third * Edition (Cambridge University Press, 2007), page 352. The hash function * applied to the counter value i is: *

* x := 3935559000370003845 * i + 2691343689449507681 (mod 264) *
x := x xor (x right-shift 21) *
x := x xor (x left-shift 37) *
x := x xor (x right-shift 4) *
x := 4768777513237032717 * x (mod 264) *
x := x xor (x left-shift 20) *
x := x xor (x right-shift 41) *
x := x xor (x left-shift 5) *
Return x *

* (The shift and arithmetic operations are all performed on unsigned 64-bit * numbers.) * * @author Alan Kaminsky * @version 30-Mar-2008 */ public class DefaultRandom extends Random { // Hidden data members. // Seed for this PRNG. private long seed; // 128 bytes of extra padding to avert cache interference. private transient long p0, p1, p2, p3, p4, p5, p6, p7; private transient long p8, p9, pa, pb, pc, pd, pe, pf; // Exported constructors. /** * Construct a new PRNG with the given seed. Any seed value is allowed. * * @param seed Seed. */ public DefaultRandom (long seed) { setSeed (seed); } // Exported operations. /** * Set this PRNG's seed. Any seed value is allowed. * * @param seed Seed. */ public void setSeed (long seed) { this.seed = hash (seed); } // Hidden operations. /** * Return the next 64-bit pseudorandom value in this PRNG's sequence. * * @return Pseudorandom value. */ protected long next() { ++ seed; return hash (seed); } /** * Return the 64-bit pseudorandom value the given number of positions ahead * in this PRNG's sequence. * * @param skip Number of positions to skip, assumed to be > 0. * * @return Pseudorandom value. */ protected long next (long skip) { seed += skip; return hash (seed); } /** * Return the hash of the given value. */ private static long hash (long x) { x = 3935559000370003845L * x + 2691343689449507681L; x = x ^ (x >>> 21); x = x ^ (x << 37); x = x ^ (x >>> 4); x = 4768777513237032717L * x; x = x ^ (x << 20); x = x ^ (x >>> 41); x = x ^ (x << 5); return x; } }

Ads help maintain this website.