MathGroup Archive 1996

[Date Index] [Thread Index] [Author Index]

Search the Archive

random number generators

  • To: mathgroup at smc.vnet.net
  • Subject: [mg4758] random number generators
  • From: wilson figueroa <wfigueroa at mosquito.com>
  • Date: Thu, 5 Sep 1996 02:00:08 -0400
  • Organization: Mosquito Net, Inc.
  • Sender: owner-wri-mathgroup at wolfram.com

Hello group,

I was wondering if anyone out there has done any of the following 
implementations of random number generators in Mma?

I could really use some help here!

The first one is the linear congruential method

Question 1: Linear Congruential Generator (LCG)

The algorithm is:

x[n+1] = (7^7*x[n])Mod[2^31-1]

and uniform variates are given by:

u[n] = x[n+1]/(2^31-1).

I implemented this but it does not seem to work properly.

The implementation I used was:

	$RecursionLimit = 100000;
	x[0] = 1;
        x[n+1] := Mod[(7^7*x[n]), 2^31 -1]//N
	u[n] := x[n]/(2^31-1)
	Table[x[n], {n,1,10000}]

Now when I do a Table of say 10000 of these, the results do not seem 
correct.  Is there a more efficient way of implementing this rather 
straightforward rng that is fast and gives correct results?

Question 2:  Marsaglia generator (subtract with borrow)

In an article "Some portable very long period rng's" Marsaglia and
Zaman (Computers in Physics, Jan/FEb 1994) algorithms are given
which allow combination generators to be used.

The first question I have is on the Subtract with borrow (which were
recently found to fail a statistical test).

The algorithm is

a[n] = (a[n-2] - a[n-5] - "C") mod (2^32-10)

the period of this generator is 2^160

uniform deviates are given by: u[n] = a[n]/(2^32-1)

The "C" here is a carry bit, not a constant!

This implementation has modulus m = 2^32 - 10, five current
integer values, say, v, w, x, y, z, and current c.

The generating procedure is:
	If y < v + c then s = v + c + - y - 10 and c = 1
        Else  s = y - v - c and c = 0.
        Then s is the output ans promotions provide a new
	set of five: v = w, w = x, x = y, y = s.
	The period is 2^160 for any initial values, not all zero.

Has anyone implemented such an algorithm using Mathematica?

I have several concerns including floating point versus integer
machine precision.

I would really appreciate any help for what appeared to me to be
a simple algorithm!

Question 3:  Mix a LCG with a SWB

An algorithm is given in which a LCG and SWB are combined.

The algorithms are as follows:

	LCG:  x[n] = (69069*x[n-1]+1013904243)mod(2^32)
	SWB:  x[n] = (x[n-2]-x[n-3]-"C")mod(2^32-18)

The "C" is a carry bit again.

A "C-program" is given as follows:

	typedef unsigned long int unlong;
	unlong x=521288629, y=362436069, z=16163801, c=1, n=1131199209;
	ulong mzran13()
	{ long int s;
	  if (y>x+c) {s=y-(x+c); c=0; )
	  else {s=y-(x+c)-18; c=1; }
	  x=y; y=z; return (z=s) + (n-60069*n+1013904243);
	};
	void ran13set(ulong xx, ulong yy, ulong zz, ulong nn)
	{ x = xx; y = yy; z = zz; c = y > z;  }

My first problem is I can't read most of this code and secondly, I
would like to implement this algorithm in Mathematica.

Question 4:

Has anyone implemented the Inverse Pseudorandom Number Generator
discussed in an article by Peter Hellelalek (Univ of Salzburg)
using Mathematica?

The algorithm is:

	y[n+1] = (a(not y[n]) + b)mod p
Note the not y[n] is (1/y[n]) provided y[n] does not equal zero,
if y[n] equals zero, set not y[n] to zero.

See http;//random.mat.sbg.ac.at. for more details.



I know there are many questions here and I apologize if this is bad
netiquette.

If there is anyone out there with more experience in these areas that
can help me, it would be greatly appreciated.


Thank you.

Wilson Figueroa

"Why is there so much to explore in a finite amount of time?"

wfiguero at mosquito.com

==== [MESSAGE SEPARATOR] ====


  • Prev by Date: Re: problem with NonlinearFit
  • Next by Date: Mathematica on neural networks
  • Previous by thread: Re: problem with NonlinearFit
  • Next by thread: Re: random number generators