我正在尝试生成随机数表(四舍五入到最接近的 5 和 10)。我想在每一行上使用两次随机数,并在下一行生成一个新的随机数。
表格1
5 5
15 15
20 20
表 2
10 10
20 20
30 30
我曾尝试使用 pgfmaths 进行此操作,但收效甚微。我的代码存在两个问题
1) 生成的数字不是 5 或 10 的倍数
2) 我需要每个表有 n 个变量。我可以生成表行中的数字吗?
我试过的代码是
\documentclass[a4paper,11pt]{article}
\usepackage{tikz}
\begin{document}
\pgfmathsetseed{1}
\pgfmathparse{mod(rand*60,5)}\let\var1=\pgfmathresult
\pgfmathparse{mod(rand*60,5)}\let\var2=\pgfmathresult
\begin{tabular}[t]{ c c }
\var1 & \var1 \\ % keep var constant on row
\var2 & \var2 \\
\end{tabular}
\pgfmathparse{mod(rand*120,10)}\let\var3=\pgfmathresult
\pgfmathparse{mod(rand*120,10)}\let\var4=\pgfmathresult
\begin{tabular}[t]{ c c }
\var3 & \var3 \\ % keep var constant on row
\var4 & \var4 \\
\end{tabular}
\end{document}
有人可以指出我正确的方向,使它发挥作用吗?
答案1
通过以下定义,您可以定义随机数的参数
\setrand{<minimum>}{<maximum>}{<multiple of>}{<seed>}
随机数由以下方式生成:
\nextrand
然后可以使用以下方式任意访问
\thisrand
以下是要包含在序言中的代码:
\usepackage{pgfmath}
\newcommand\randmin{}
\newcommand\randmax{}
\newcommand\randmultof{}
\newcommand\setrand[4]%
{\def\randmin{#1}%
\def\randmax{#2}%
\def\randmultof{#3}%
\pgfmathsetseed{#4}%
}
\newcommand\nextrand
{\pgfmathparse{int(int((rnd*(\randmax-\randmin+1)+\randmin)/\randmultof)*\randmultof)}%
\xdef\thisrand{\pgfmathresult}%
}
此定义将生成在以下之间均匀分布的整数“最低限度”和“最大限度”然后被截断为下一个倍数“多个”。如果希望倍数本身均匀分布,则必须选择比倍数小一的最大值。例如,以下两种设置
\setrand{0}{60}{5}{42}
\setrand{0}{64}{5}{42}
会生成 0 到 60 之间的均匀分布数字,第一个会导致在截断到下一个倍数之前均匀分布,第二个会导致截断数字均匀分布。从原始帖子中看不出这两种解释中的哪一种是预期的(至少对我来说不是)。
以下是说明这些命令用法的示例文档。
\documentclass{article}
\usepackage{pgfmath}
\newcommand\randmin{}
\newcommand\randmax{}
\newcommand\randmultof{}
\newcommand\setrand[4]%
{\def\randmin{#1}%
\def\randmax{#2}%
\def\randmultof{#3}%
\pgfmathsetseed{#4}%
}
\newcommand\nextrand
{\pgfmathparse{int(int((rnd*(\randmax-\randmin+1)+\randmin)/\randmultof)*\randmultof)}%
\xdef\thisrand{\pgfmathresult}%
}
\begin{document}
\setrand{0}{64}{5}{42} % random numbers between 0 and 60, multiples of 5, seed 42
\begin{tabular}[t]{ r r }
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand
\end{tabular}
\qquad
\setrand{0}{129}{10}{42} % random numbers between 0 and 120, multiples of 10, seed 42
\begin{tabular}[t]{ r r }
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand \\
\nextrand\thisrand & \thisrand
\end{tabular}
\end{document}
答案2
\documentclass[a4paper,11pt]{article}
\usepackage{tikz}
\begin{document}
\pgfmathsetseed{1}
\pgfmathparse{int(random(0,12)*5)}\let\vara=\pgfmathresult
\pgfmathparse{int(random(0,12)*5)}\let\varb=\pgfmathresult
\begin{tabular}[t]{ c c }
\vara & \vara \\ % keep var constant on row
\varb & \varb \\
\end{tabular}
\pgfmathparse{int(random(0,12)*10)}\let\varc=\pgfmathresult
\pgfmathparse{int(random(0,12)*10)}\let\vard=\pgfmathresult
\begin{tabular}[t]{ c c }
\varc & \varc \\ % keep var constant on row
\vard & \vard \\
\end{tabular}
\end{document}
TeX 命令名称中不能包含数字(默认设置),\vara
因此\var1
答案3
为了确保万无一失,这里有一个基于 LuaLaTeX 的解决方案。
下面的代码定义了一个名为 的 LaTeX 宏\randtable
,它接受 1 个参数:两列表格应有的行数。LaTeX 宏充当 Lua 函数的接口,该函数称为randtable
,负责实际工作。
默认情况下,随机整数的范围为0
到100
,包括端点,步长为5
。要将范围从0
到更改为,请在下面代码中更改为。(补充:如果是整数,则 Lua 函数会生成范围从100
到的均匀分布的整数。)5
50
5*(math.random(21)-1)
5*(math.random(10))
n
math.random(n)
1
n
% !TeX program = lualatex
\documentclass{article}
\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
function tablerand ( n )
tex.sprint( "\\begin{tabular}[t]{cc}" )
for i=1,n do
z = 5*(math.random(21)-1) -- random integers from 0 to 100, stepsize=5
tex.sprint ( z .. "&" .. z .. "\\\\" )
end
tex.sprint( "\\end{tabular}" )
end
\end{luacode}
\newcommand\tablerand[1]{\directlua{tablerand(#1)}} % LaTeX macro to invoke the Lua function
\begin{document}
\tablerand{5}, \tablerand{15}, \tablerand{10}
\end{document}
答案4
和 R 的解决方案knitr
:一个简单的rtable()
函数生成随机数和表。参数设置可能值的数量。
\documentclass{article}
\usepackage{booktabs}
\begin{document}
<<echo=F>>=
library(xtable)
rtable <- function(x){
a <- sample.int(x,size=3,replace=T)*5
print(xtable(data.frame(a,a),caption="",digits=0),
include.rownames=F, include.colnames=F,
caption.placement = "top",booktabs = T)}
@
<<results="asis",echo=F>>=
set.seed(123)
rtable(3)
rtable(30)
rtable(3000)
@
\end{document}