diff options
Diffstat (limited to 'tex/context/base/thrd-ran.tex')
-rw-r--r-- | tex/context/base/thrd-ran.tex | 174 |
1 files changed, 119 insertions, 55 deletions
diff --git a/tex/context/base/thrd-ran.tex b/tex/context/base/thrd-ran.tex index 9dd509492..ea19c7a20 100644 --- a/tex/context/base/thrd-ran.tex +++ b/tex/context/base/thrd-ran.tex @@ -1,6 +1,9 @@ % Since we cannot be sure that this file is available at any % system, we have copied the original in this file. These % macros are encapsulates and extended in supp-ran.tex. +% +% This module is slightly recoded to bring it more in tune +% with \CONTEXT's scratch registers and protection mechanisms. % RANDOM.TEX v.1 (Donald Arseneau) % Generating "random" numbers in TeX. @@ -39,66 +42,127 @@ % 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. + +% original code +% +% \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 +% } +% +% %D The next macro is not needed in \CONTEXT, which provides +% %D the \type {\withoutpt} macro. +% %D +% %D \starttypen +% %D \def\pointless{\expandafter\PoinTless\the} +% %D {\catcode`p=12 \catcode`t=12 \gdef\PoinTless#1pt{#1}} +% %D \stoptypen +% +% \catcode`\@=\randomi +% \global\randomi=0 +% \newcount\ranval + +% the recoded version, using \CONTEXT\ methods and variables; +% the magic is kept untouched + +\unprotect \newcount\randomi % the random number seed (while executing) -\global\randomi\catcode`\@ % scratch variable during definitions -\catcode`\@=11 +\newcount\ranval -\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 -} +\ifx\m!systems\undefined \def\m!systems{system} \fi -\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\nextrandom + {\begingroup + \ifnum\randomi<\plusone % then initialize with time + \global\randomi\time + \global\multiply\randomi388 \global\advance\randomi\year + \global\multiply\randomi 31 \global\advance\randomi\day + \global\multiply\randomi 97 \global\advance\randomi\month + \writestatus\m!systems{randomizer starts with \the\randomi}% + \nextrandom \nextrandom \nextrandom + \fi + \!!countd\randomi + \divide\!!countd 127773 % modulus = multiplier * 127773 + 2836 + \!!countc\!!countd + \multiply\!!countd 127773 + \global\advance\randomi-\!!countd % random mod 127773 + \global\multiply\randomi 16807 + \multiply\!!countc 2836 + \global\advance\randomi-\!!countc + \ifnum\randomi<\zerocount + \global\advance\randomi 2147483647 + \fi + \endgroup} -\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\setrannum#1#2#3% count register, minimum, maximum + {\!!counta#3% + \advance\!!counta-#2% + \advance\!!counta\plusone + \!!countb 2147483645 % = m - 2 = 2^{31} - 3 + \divide\!!countb\!!counta + \getr@nval + \advance\ranval#2% + #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\setrandim#1#2#3% dimen register, minimum length, maximum length + {\!!dimenc#2% + \!!dimend#3% + \setrannum\ranval\!!dimenc\!!dimend + #1\ranval\s!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\getr@nval % The values in \!!counta and \!!countb are parameters + {\nextrandom + \ranval\randomi + \advance\ranval\minusone + \divide\ranval\!!countb + \ifnum\ranval<\!!counta \else + \expandafter\getr@nval + \fi} -%D The next macro is not needed in \CONTEXT, which provides -%D the \type {\withoutpt} macro. -%D -%D \starttypen -%D \def\pointless{\expandafter\PoinTless\the} -%D {\catcode`p=12 \catcode`t=12 -%D \gdef\PoinTless#1pt{#1}} -%D \stoptypen - -\catcode`\@=\randomi -\global\randomi=0 -\newcount\ranval +\protect \endinput |