生成随机数表

生成随机数表

我正在尝试生成随机数表(四舍五入到最接近的 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,负责实际工作。

默认情况下,随机整数的范围为0100,包括端点,步长为5。要将范围从0到更改为,请在下面代码中更改为。(补充:如果是整数,则 Lua 函数会生成范围从100到的均匀分布的整数。)5505*(math.random(21)-1)5*(math.random(10))nmath.random(n)1n

在此处输入图片描述

% !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}

表

相关内容