我正在尝试创建一个随机游动(作为真正的布朗运动的替代),其起点和终点均为 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}
变换后的点呈蓝色且连通。