![获取非均匀分布的随机 0 和 1 抽取表](https://linux22.com/image/417156/%E8%8E%B7%E5%8F%96%E9%9D%9E%E5%9D%87%E5%8C%80%E5%88%86%E5%B8%83%E7%9A%84%E9%9A%8F%E6%9C%BA%200%20%E5%92%8C%201%20%E6%8A%BD%E5%8F%96%E8%A1%A8.png)
我希望生成一个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
之间的伪随机数。如果随机数大于,则输出,否则输出。1
n
m
1
0
\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
按钮的位置Build
。Force Build
单击Build Control and Log
将返回这 2 个按钮。
我刚刚注意到你关于让代码与 一起工作的评论standalone
。这也很容易做到。以下是输出:
编辑:我需要补充的是,Sage,这个使事物运行的计算机代数系统,既可以下载并安装在你的电脑上,也可以通过免费可钙帐户。它很简单,您可以在几分钟内启动并运行。在您的计算机上安装 Sage 更成问题。软件包上的文档sagetex
是这里。