获取非均匀分布的随机 0 和 1 抽取表

获取非均匀分布的随机 0 和 1 抽取表

我希望生成一个n x m随机抽取的 0 和 1 的矩阵,每次编译时都会更新抽取的内容。到目前为止,我已经使用以下表格代码实现了此目的15 x 10

但是,每次抽取 0 和 1 的概率为p=0.5。我希望能够输入任意p。我该怎么做?

我也很感激能够以一种不那么笨拙的方式来输入/更改该表/矩阵的行数和列数。

\documentclass{standalone}
\usepackage{pgf}

\pgfmathsetseed{\pdfuniformdeviate 10000000} % fresh draws with each comile
\newcommand{\Rand}{\pgfmathparse{int(random(2)-1)}\pgfmathresult}

\begin{document}
\begin{tabular}{*{10}{c}}
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand \\
    \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand & \Rand 
\end{tabular}
\end{document}

答案1

p=0.5等于1中有2。所以我可以说p=m/n意味着m中有n。然后很容易利用\int_rand:n {<number (here is n)>}来获取和expl3之间的伪随机数。如果随机数大于,则输出,否则输出。1nm10

\documentclass{article}
\usepackage{nicematrix}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand {\Rand} { O{1} O{2} } {
  \int_compare:nTF {\int_rand:n {#2} <= #1}{0}{1}
}
\ExplSyntaxOff

\begin{document}
\[
  \AutoNiceMatrix{15-10}{\Rand}
  \mskip 100mu
  \AutoNiceMatrix{15-10}{\Rand[1][10]}
\]
\end{document}

在此处输入图片描述

tikz 随机矩阵

\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{matrix, positioning}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand {\Rand} { O{1} O{2} } {
  \int_compare:nTF {\int_rand:n {#2} <= #1}{0}{1}
}
\tl_new:N \l__rand_matrix_body_tl
% https://tex.stackexchange.com/a/548881/201158 @egrep
\NewDocumentCommand {\RandMatrix} { O{} D(){matrix} m m O{1} O{2} } {
  \group_begin:
  \tl_clear:N \l__rand_matrix_body_tl
  \int_step_inline:nn {#3} {
    \tl_put_right:Nn \l__rand_matrix_body_tl {\use_none:n}
    \int_step_inline:nn {#4} {
      \tl_put_right:Nn \l__rand_matrix_body_tl {
        \pgfmatrixnextcell \Rand[#5][#6]
      }
    }
    \tl_put_right:Nn \l__rand_matrix_body_tl {\\}
  }
  \matrix [#1] (#2) {\tl_use:N \l__rand_matrix_body_tl};
  \group_end:
}
\ExplSyntaxOff

\begin{document}
\begin{tikzpicture}
  \RandMatrix[matrix of nodes, draw, row 1 column 1/.style=red](a){15}{10}
  \RandMatrix[matrix of nodes, right=of a, row 1 column 3/.style=red](b){15}{10}[1][10]
  \node [above=1em of a] {$p=0.5$};
  \node [above=1em of b] {$p=0.1$};
  \draw [->] (a-1-1) edge [bend left=20] (b-1-3);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是一个sagetex解决方案。

\documentclass{article}
\usepackage{sagetex,amsmath,amssymb}
\begin{document}
\begin{sagesilent}
import numpy as np
def randbin(M,N,P):
    return np.random.choice([0, 1], size=(M,N), p=[P, 1-P])

matrixA = latex(matrix(randbin(15,10,.5)))
A = matrixA[6:-7]
\end{sagesilent}
\noindent
$\sagestr{A}$
\end{document}

我在接受的答案中找到了构造 numpy 数组的代码这里并修复了它。该函数randbin(M,N,P)将创建一个 m 乘 n 阶的 numpy 数组,其中条目为 0 的概率为 P。打印该结果会看起来很丑陋,因为它会是 [[0,1,0],[0,1,1]...] 这样的格式。我获取该 numpy 数组并使用以下行为其矩阵创建 latex 代码matrixA = latex(matrix(randbin(15,10,.5)))。来自文档这里我知道矩阵将以 开头\left(并以 结尾\right),因此我从字符串中删除了A = matrixA[6:-7]。这给了我数组中的数字。在 Cocalc 中运行的结果如下所示:

在此处输入图片描述

从图片中可以看出,在零和一的数组下方有一个按钮Build和一个按钮Force Build。使用Force Build按钮将重新编译并更改数字,而“Build”将重新编译而不更改数字。通过将 M、N 和 P 的值更改为 25、25 和 .25,您可以快速创建另一个数组:

在此处输入图片描述

最后要观察的是第二张图片。它显示了Build Control and Log按钮的位置BuildForce Build单击Build Control and Log将返回这 2 个按钮。

我刚刚注意到你关于让代码与 一起工作的评论standalone。这也很容易做到。以下是输出:

在此处输入图片描述

编辑:我需要补充的是,Sage,这个使事物运行的计算机代数系统,既可以下载并安装在你的电脑上,也可以通过免费可钙帐户。它很简单,您可以在几分钟内启动并运行。在您的计算机上安装 Sage 更成问题。软件包上的文档sagetex这里

相关内容