/usr/share/texlive/texmf-dist/tex/generic/genmisc/random.tex is in texlive-generic-recommended 2013.20140215-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | % RANDOM.TEX v.1 (Donald Arseneau)
% 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 should 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. A smaller range would
% reduce the complexity of the macros a bit, but not much--most of the
% code deals with initialization and type-conversion. On the other hand,
% the large range may be wasted due to the sparse seed initialization.
\newcount\randomi % the random number seed (while executing)
\global\randomi\catcode`\@ % scratch variable during definitions
\catcode`\@=11
\def\nextrandom{\begingroup
\ifnum\randomi<\@ne % then initialize with time
\global\randomi\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
\fi
\count@ii\randomi
\divide\count@ii 127773 % modulus = multiplier * 127773 + 2836
\count@\count@ii
\multiply\count@ii 127773
\global\advance\randomi-\count@ii % random mod 127773
\global\multiply\randomi 16807
\multiply\count@ 2836
\global\advance\randomi-\count@
\ifnum\randomi<\z@ \global\advance\randomi 2147483647\relax\fi
\endgroup
}
\countdef\count@ii=2 % use only in boxes!
\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
\@tempcnta#3\advance\@tempcnta-#2\advance\@tempcnta\@ne
\@tempcntb 2147483645 % = m - 2 = 2^{31} - 3
\divide\@tempcntb\@tempcnta
\getr@nval
\advance\ranval#2\relax
#1\ranval
}
\def\setrandim#1#2#3{% dimen register, minimum length, maximum length
\dimen@#2\dimen@ii#3\relax
\setrannum\ranval\dimen@\dimen@ii
#1\ranval sp\relax
}
\def\getr@nval{% The values in \@tempcnta and \@tempcntb are parameters
\nextrandom
\ranval\randomi \advance\ranval\m@ne \divide\ranval\@tempcntb
\ifnum\ranval<\@tempcnta\else \expandafter\getr@nval \fi
}
\def\pointless{\expandafter\PoinTless\the}
{\catcode`p=12 \catcode`t=12
\gdef\PoinTless#1pt{#1}}
\catcode`\@=\randomi
\global\randomi=0
\newcount\ranval
|