PGF/Tikz:随机种子设置为相同的数字,在不同情况下获得不同的输出

PGF/Tikz:随机种子设置为相同的数字,在不同情况下获得不同的输出

我正在尝试创建一个随机游动(作为真正的布朗运动的替代),其起点和终点均为 0。

我使用每个步骤的随机数生成随机游走,并且使其在最后返回到 0 的标准方法是根据原始随机游走中的端点值将其仿射地向下移动。

我不知道在 TikZ 中如何做到这一点,除非生成一次随机数来计算(随机)端点是什么,然后使用它来绘制仿射移位随机游走,使用相同的随机数。

不幸的是我的代码(随机游走位,取自这里) 我认为应该这样做,但事实并非如此;用于计算端点的随机数与绘图中使用的随机数不同,即使我在每个部分之前将随机种子设置为相同的固定数字。这是一个 MWE:

\documentclass[10pt]{article}
\usepackage{tikz}

\usetikzlibrary{calc}

\newcommand{\bb}[5]{% points, advance, rand factor, options, seed
\xdef\y{0}
\pgfmathsetseed{#5} 

\foreach \x in {1,...,#1}
{
    \pgfmathparse{\y + rand*#3} % computing next step of random walk
    \xdef\y{\pgfmathresult}
    \node[circle, fill, inner sep=0pt, outer sep=0pt, minimum size=2mm, scale=0.1] at (\x*#2-3, \y) {}; % to see what random walk is being used to compute endpoint
}

\pgfmathsetseed{#5}
\draw[#4] (-3,0)
\foreach \x in {1,...,#1}
{  -- ++(#2,rand*#3)
};
}

\begin{document}

\begin{tikzpicture}
    \bb{700}{0.02}{0.09}{}{1355}
    \draw (-3,-3) rectangle (11,3);
\end{tikzpicture}
\end{document}

我在得到端点 \y 之后排除了计算仿射移位的代码;这只是为了表明我得到了不同的图。

下面是我得到的图(“鬼影”是正在计算端点的随机游走,黑色的是之后绘制的图):

在此处输入图片描述

如果有其他简单的方法可以实现具有所需终点的随机游走,我也会很高兴知道这一点。

答案1

我只会将随机数存储在列表中。 (我猜想仿射变换可以通过某种算法检测到,但我可能错了。我对随机种子的理解是,它取决于你在随机种子和“随机”数的实际计算之间所做的事情,但我可能也错了。)

\documentclass[10pt]{article}
\usepackage{tikz}

\usetikzlibrary{calc}

\newcommand{\bb}[5]{% points, advance, rand factor, options, seed
\xdef\y{0}
\pgfmathsetseed{#5} 
\xdef\lst{}
\foreach \x [count=\n] in {1,...,#1}
{
    \pgfmathparse{\y + rand*#3} % computing next step of random walk
    \xdef\y{\pgfmathresult}
    \xdef\finaly{\pgfmathresult}
    \xdef\finaln{\n}
    \ifnum\n=1\relax
    \xdef\lst{{\x/\y}}
    \else
    \xdef\lst{\lst,{\x/\y}}
    \fi
    \node[circle, fill, inner sep=0pt, outer sep=0pt, minimum size=2mm, scale=0.1] at (\x*#2-3, \y) {}; % to see what random walk is being used to compute endpoint
}

\typeout{\finaly\space\finaln}
\foreach \x/\y [count=\n] in \lst
{
\pgfmathsetmacro{\newy}{\y-(\n/\finaln)*\finaly}
\node[blue,circle, fill, inner sep=0pt, outer sep=0pt, minimum size=2mm,
scale=0.1] at (\x*#2-3, \newy) {};
}
\draw[#4] (-3,0)
\foreach \x/\y [count=\n] in \lst
{
\pgfextra{\pgfmathsetmacro{\newy}{\y-(\n/\finaln)*\finaly}}
  -- (\x*#2-3,\newy)
};
}

\begin{document}

\begin{tikzpicture}
    \bb{700}{0.02}{0.09}{}{1355}
    \draw (-3,-3) rectangle (11,3);
\end{tikzpicture}
\end{document}

在此处输入图片描述

变换后的点呈蓝色且连通。

相关内容