一维随机游走

一维随机游走

我正在研究随机游走,我想创建一个一维图像。下面是一个二维游走的相当不错的图像:在 TikZ 中绘制随机路径(尽管出于某种原因它不会每次都重新计算 - 但这并不重要)。但我不知道如何为 1 维创建一个。

我希望它看起来像这样:

在此处输入图片描述

到目前为止我已经尝试过:

\pgfmathsetseed{1}

\begin{tikzpicture}[x=6pt,y=6pt,baseline,scale=1,rotate=45]
 \coordinate (current point) at (0,0);
 \coordinate (old velocity) at (0,0);
 \coordinate (new velocity) at (0.5,rand);
 \foreach \i in {0,1,...,20}
 {
   \draw (current point) 
   .. controls ++([scale=0.2]old velocity) and ++(new velocity) .. ++(0.5,rand)
      coordinate (current point);
   \coordinate (old velocity) at (new velocity);
   \coordinate (new velocity) at (0.5,rand);
 }
\end{tikzpicture}

答案1

也许是这样的?

\documentclass[tikz,margin=5]{standalone}
\begin{document}
\tikz[x=1pt,y=10pt]
  \foreach \c in {red, green, blue}
    \draw [\c] (0,0) \foreach ~ in {0,...,1000}{-- ++(1,{random(0,1)*2-1})};
\end{document}

在此处输入图片描述

答案2

由于您有点担心速度,这里是移植到 Metapost + LuaTeX 的 Mark Wilbrow 解决方案(我使用 ConTeXt,但您也可以使用与 LuaLaTeX + mplib 类似的解决方案)。

\setupMPpage[instance=doublefun]
\starttext
\dorecurse{3}{
\startMPpage
  ux := 0.5pt; 
  uy := 2pt;
  vardef jump = 2*(uniformdeviate 1) - 1 enddef;
  path p;
  z[0] = origin;
  p := z[0] for i = 1 upto 1000 :
    hide(z[i] = z[i-1] + (ux, jump*uy);) -- z[i]
  endfor;

  draw p ;
\stopMPpage}
\stoptext

instance=doublefun行告诉 metapost 使用双精度(而不是通常的缩放精度。我画了三条线以便与 TikZ 进行公平的速度比较。

在此处输入图片描述

在我的 2013 款 Macbook 上,我得到以下时间:

  • 对于 Mark Wibrow 的 Tikz 解决方案:

    $time pdflatex --interaction=batchmode rand-ltx.tex 2.45s user 0.02s system 99% cpu 2.491 total

  • 对于上述luatex + metapost(ConTeXT)解决方案:

    $time contextjit rand-c --once --noconsole 0.77s user 0.08s system 97% cpu 0.867 total

因此 metapost 大约快 3 倍(可能更多,因为 luatex + opentype 字体的加载时间比 pdftex 的加载时间大得多)。

您还可以尝试不同类型的线路连接,看看哪种结果更好(我正在尝试--.. tension 2 ..和`..张力 3')。

\setupMPpage[instance=doublefun]
\starttext
\setvalue{line:1}{--}
\setvalue{line:2}{.. tension 2 ..}
\setvalue{line:3}{.. tension 3 ..}
\startTEXpage
\dorecurse{3}
{\startMPcode
  randomseed := 42;
  ux := 1pt; 
  uy := 4pt;
  vardef jump = 2*(uniformdeviate 1) - 1 enddef;
  path p;
  z[0] = origin;
  p := z[0] for i = 1 upto 100 :
    hide(z[i] = z[i-1] + (ux, jump*uy);) \getvalue{line:\recurselevel} z[i]
  endfor;

  draw p ;
\stopMPcode
\endgraf}
\stopTEXpage
\stoptext

这使

在此处输入图片描述

第二条曲线和第三条曲线之间存在细微的差别。

相关内容