关于伪随机数生成器

关于伪随机数生成器

Schulte Table(Tran Le Nam 的作者)的 TikZ 代码:

\documentclass[12pt,tikz,border=3mm]{standalone}
\usetikzlibrary{calc}
\usepackage{xstring}
\begin{document}
\large
\begin{tikzpicture}
\def\n{5}
\def\mylist{}
\pgfmathsetmacro{\numbermax}{\n*\n}
\foreach \x in {1,...,\numbermax}{ 
    \xdef\mylist{\mylist\noexpand{\x\noexpand}}
}
\begin{scope} 
\pgfmathsetmacro{\nt}{\n-1}
\foreach \i in {0,...,\nt}
{
    \foreach \j in {0,...,\nt}
    { \pgfmathdeclarerandomlist{mynum}{\mylist}
        \pgfmathrandomitem{\mynum}{mynum}
        \StrSubstitute{\mylist}{{\mynum}}{}[\sublist]
        \global\let\mylist\sublist 
        \pgfmathparse{0.9*rnd+0.3} \pgfmathsetmacro{\maum}{\pgfmathresult}
        \pgfmathparse{0.8*rnd} \pgfmathsetmacro{\mauh}{\pgfmathresult}
        \definecolor{mau}{rgb}{\maum,\mauh,0.1}
        \node[color=mau] at ($ (\i+0.5, \j+0.5 ) $) {\mynum};
    } 
}
\draw (0,0) grid (\n,\n);
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

说实话,到现在为止,我还不知道任何 PSTricks 文档中有“随机语法”一说。我能在哪里找到“随机语法”?

更新:

\documentclass[12pt,pstricks,border=5pt]{standalone}
\usepackage{pst-math}
\usepackage{multido}
\begin{document}
\newcounter{RandNo} 
\setcounter{RandNo}{1}
\def\n{7} \def\m{10}
\def\N{\the\numexpr\m*\n}
\defineRandIntervall(1,\N){\N}
\makeRandomNumberList 
%\resetcolorseries[\N]{test}

\begin{pspicture}(\m,\n)
\psgrid[subgriddiv=0,gridlabels=0pt]
\multido{\rRow=0.5+1.0}{\n}{\multido{\rCol=0.5+1.0}{\m}{%
        \rput(\rCol,\rRow){\getNumberFromList{\theRandNo}}%
        \stepcounter{RandNo}}}
\end{pspicture}
\end{document}

它正常产生图形:

enter image description here

\documentclass[12pt,pstricks,border=5pt]{standalone}
\usepackage{pst-math}
\usepackage{multido}
\definecolorseries{test}{rgb}{step}[rgb]{.95,.85,.55}{.17,.47,.37}
\begin{document}
\newcounter{RandNo} 
\setcounter{RandNo}{1}
\def\n{7} \def\m{10}
\def\N{\the\numexpr\m*\n}
\defineRandIntervall(1,\N){\N}
\makeRandomNumberList 
\resetcolorseries[\N]{test}

\begin{pspicture}(\m,\n)
\psgrid[subgriddiv=0,gridlabels=0pt]
\multido{\rRow=0.5+1.0}{\n}{\multido{\rCol=0.5+1.0}{\m}{%
    \rput(\rCol,\rRow){\textcolor{test!!+}{\getNumberFromList{\theRandNo}}%
        \stepcounter{RandNo}}}
\end{pspicture}
\end{document}

编译器没有得到结果.... :((

答案1

不是与之一起工作xelatex(它不知道随机函数)

\documentclass[12pt]{article}
\usepackage{pstricks,pst-calculate,multido}
\usepackage{auto-pst-pdf}
\definecolorseries{test}{rgb}{step}[rgb]{.95,.85,.55}{.17,.47,.37}
\begin{document}

\def\n{5}
\begin{pspicture}(\n,\n)
\psgrid[subgriddiv=0,gridlabels=0pt]
\resetcolorseries[25]{test}
\multido{\rRow=0.5+1.0}{\n}{%
  \multido{\rCol=0.5+1.0}{\n}{%
    \rput(\rCol,\rRow){\textcolor{test!!+}{\pscalculate{randint(1,25)}}}
}}
\end{pspicture}

\end{document}

enter image description here

还有一个带有单个随机数的解决方案。随机内容是最新的一部分pst-math

\documentclass[12pt]{article}
\usepackage{pstricks,pst-math}
\usepackage{multido}
\usepackage{auto-pst-pdf}
\definecolorseries{test}{rgb}{step}[rgb]{.95,.85,.55}{.17,.47,.37}
\begin{document}

\newcounter{RandNo} \setcounter{RandNo}{1}
\def\n{5} \def\N{\the\numexpr\n*\n}
\defineRandIntervall(1,\N){\N}
\makeRandomNumberList  
\resetcolorseries[25]{test}

\begin{pspicture}(\n,\n)
\psgrid[subgriddiv=0,gridlabels=0pt]
\multido{\rRow=0.5+1.0}{\n}{\multido{\rCol=0.5+1.0}{\n}{%
  \rput(\rCol,\rRow){\textcolor{test!!+}{\getNumberFromList{\theRandNo}}}%
  \stepcounter{RandNo}}}
\end{pspicture}

\end{document}

enter image description here

luatex对于大正方形,使用它进行计算更有意义。使用 运行以下示例lualatex --shell-escape <file>需要包luarandom,该包将在未来几天内为 TeXLive 或 MikTeX 提供。或者在这里: http://comedy.dante.de/~herbert/TeXnik/tex/lualatex/luarandom/

\documentclass[12pt]{article}
\usepackage{xcolor,pstricks}
\usepackage{multido}
\usepackage{pst-math}
\usepackage{auto-pst-pdf-lua}
\ifpdf\else\usepackage[T1]{fontenc}\fi
\begin{document}

\newcounter{RandNo} \setcounter{RandNo}{1}
\def\n{10} \def\N{\the\numexpr\n*\n}
\makeRandomNumberList{1}{\N}{\N}  

\begin{pspicture}(\n,\n)
\psgrid[subgriddiv=0,gridlabels=0pt]
\multido{\rRow=0.5+1.0}{\n}{\multido{\rCol=0.5+1.0}{\n}{%
  \edef\RNumber{\getNumberFromList{\theRandNo}}%
  \rput(\rCol,\rRow){\textcolor{randomhsb}{\RNumber}%
    \stepcounter{RandNo}}}}
\end{pspicture}

\end{document}

enter image description here

答案2

纯粹的 PSTricks 解决方案也是可行的,但我们不应该重新发明轮子。

\documentclass[12pt,pstricks,border=1pt]{standalone}
\usepackage{tikz,xstring}
\usetikzlibrary{calc}
\def\n{5}\def\mylist{}

\pgfmathsetmacro{\numbermax}{\n*\n}
\foreach \x in {1,...,\numbermax}{ 
    \xdef\mylist{\mylist\noexpand{\x\noexpand}}
}
\pgfmathsetmacro{\nt}{\n-1}
\newpsstyle{gridstyle}{griddots=0,subgriddiv=1}
\begin{document}
\large
\begin{pspicture}[showgrid](\n,\n)
\foreach \i in {0,...,\nt}
{
    \foreach \j in {0,...,\nt}
    {   \pgfmathdeclarerandomlist{mynum}{\mylist}
        \pgfmathrandomitem{\mynum}{mynum}
        \StrSubstitute{\mylist}{{\mynum}}{}[\sublist]
        \global\let\mylist\sublist 
        \pgfmathparse{0.9*rnd+0.3} \pgfmathsetmacro{\maum}{\pgfmathresult}
        \pgfmathparse{0.8*rnd} \pgfmathsetmacro{\mauh}{\pgfmathresult}
        \definecolor{mau}{rgb}{\maum,\mauh,0.1}
        \rput(!\i\space .5 add \j\space .5 add){\color{mau}\mynum}
    } 
}
\end{pspicture}
\end{document}

enter image description here

关于伪随机数生成器

Rand 产生一个介于 0 和 1 之间(包括 0 和 1)的浮点随机数,并rand产生一个“巨大”的整数。

\documentclass[pstricks,border=12pt,12pt]{standalone}
\pstVerb{realtime srand}

\begin{document}
\begin{pspicture}[showgrid](6,6)
        \psLoop{5}{\qdisk(!Rand 6 mul Rand 6 mul){!Rand 4 div}}
\end{pspicture}
\end{document}

enter image description here

相关内容