[pstricks] [MiKTeX] random variables with latex

Joel Coltoff joel at wmi.com
Mon Mar 2 22:23:32 CET 2009

azzam.hassan at voila.fr wrote:
> Hello 
> How can one obtain random values (To be assignated to a given counter)with tex and/or latex or eventually with psticks?
> Thanks un advance

This is from a 1995 posting to comp.text.tex by Donald Arseneau.
I don't remember if I tried it. I hope I got the cut and paste
correct. If you try it and there are problems email me and
I'll send it to you directly as an attachment.

- Joel

% RANDOM.TEX   Generating "random" numbers in TeX.
% Random integers are generated in the range 1 to 2147483646 by the
% macro \nextrandom.  The result is returned in the counter \randomi.
% Do not change \randomi except, perhaps, to initialize it at some
% random value.  If you do not initialize it, it will be initialized
% using the time and date.  (This is a sparse initialization, giving
% fewer than a million different starting values, but you can use
% other sources of numbers if they are available -- just remember that
% most of the numbers available to TeX are not at all random.)
% The \nextrandom command is not very useful by itself, unless you
% have exactly 2147483646 things to choose from.  Much more useful
% is the \setrannum command which sets a given counter to a random
% value within a specified range.  There are three parameters:
% \setrannum {<counter>} {<minimum>} {<maximum>}.  For example, to
% simulate a die-roll: \setrannum{\die}{1}{6} \ifcase\die... .
% If you need random numbers that are not integers, you will have to
% use dimen registers and \setrandimen.  For example, to set a random
% page width: \setrandimen \hsize{3in}{6.5in}.  The "\pointless" macro
% will remove the "pt" that TeX gives so you can use the dimensions
% as pure `real' numbers.  In that case, specify the range in pt units.
% For example,
%   \setrandimen\answer{2.71828pt}{3.14159pt}
%   The answer is \pointless\answer.
% The random number generator is the one by Lewis, Goodman, and Miller
% (1969) and used as "ran0" in "Numerical Recipies" using Schrage's
% method for avoiding overflows.  The multiplier is 16807 (7^5), the
% added constant is 0, and the modulus is 2147483647 (2^{31}-1).  The
% range of integers generated is 1 - 2147483646

\edef\randomi{\the\catcode`\@}  % scratch variable, but no waste of hash

  \ifnum\randomi<\@ne % then initialize with time
     \global\multiply\randomi388 \global\advance\randomi\year
     \global\multiply\randomi31 \global\advance\randomi\day
     \global\multiply\randomi97 \global\advance\randomi\month
     \message{Randomizer initialized to \the\randomi.}%
     \nextrandom \nextrandom \nextrandom
  \count at ii\randomi
  \divide\count at ii 127773 % modulus = multiplier * 127773 + 2836
  \count@\count at ii
  \multiply\count at ii 127773
  \global\advance\randomi-\count at ii % random mod 127773
  \global\multiply\randomi 16807
  \multiply\count@ 2836
  \ifnum\randomi<\z@ \global\advance\randomi 2147483647\relax\fi

\countdef\count at ii=2
\ifx\@tempcnta\undefined \csname newcount\endcsname \@tempcnta \fi
\ifx\@tempcntb\undefined \csname newcount\endcsname \@tempcntb \fi

\def\setrannum#1#2#3{% count register, minimum, maximum
  \@tempcntb 2147483645 %  =  m - 2  =  2^{31} - 3
  \getr at nval

\def\setrandim#1#2#3{% dimen register, minimum length, maximum length
  \dimen@#2\dimen at ii#3\relax
  \setrannum\ranval\dimen@\dimen at ii
  #1\ranval sp\relax

\def\getr at nval{% The values in \@tempcnta and \@tempcntb are parameters
  \ranval\randomi \advance\ranval\m at ne \divide\ranval\@tempcntb
  \ifnum\ranval<\@tempcnta\else \expandafter\getr at nval \fi

{\catcode`p=12 \catcode`t=12

\newcount\randomi \global\randomi=0

More information about the PSTricks mailing list