我正在尝试创建一个由随机数组成的工作表,以便孩子们可以练习整数运算。例如
3+-9=?
2x(-5)=?
18/-3=?
ETC。
我该怎么做呢?
这是迄今为止我尝试过的。
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\pgfmathparse{random(-10,10)}
\pgfmathresult
\end{document}
两个问题。
- 为什么整数前面多了一个0.0.?
- 为什么我的界限是 -10 和 10,而随机数却是 7?反复选择 7 似乎不太随机。
其中一些内容在另一个线程但这个话题已经有好几年了。
有想法吗?
谢谢!
答案1
为了解决该random
函数的错误,你可以定义一个新randomfixed
函数:
\tikzset{declare function={randomfixed(\a,\b) = int(random(0,int(\b-\a))+\a);}}
现在,您可以在两个边界之间生成一个随机整数,并用括号括起来表示负整数:
\newcommand\randomint[2]{\bgroup%
\pgfmathsetmacro\myval{randomfixed(#1,#2)}%
\pgfmathsetmacro\final{(\myval < 0)?"(\myval)":\myval}%
\final\egroup%
}
您可以生成随机运算符:
\def\ops{{"+","-","\times","/"}}
\newcommand\randomop{\bgroup\pgfmathsetmacro\op{\ops[int(rnd*4)]}\op\egroup}
要每秒更改伪随机数生成器的种子,您可以使用宏\pdfuniformdeviate
:
\pgfmathsetseed{\pdfuniformdeviate 10000000}
全部代码:
\documentclass{article}
\usepackage{tikz}
% fix bug with random(a,b)
\tikzset{declare function={randomfixed(\a,\b) = int(random(0,int(\b-\a))+\a);}}
% get random integer
\newcommand\randomint[2]{\bgroup%
\pgfmathsetmacro\myval{randomfixed(#1,#2)}%
\pgfmathsetmacro\final{(\myval < 0)?"(\myval)":\myval}%
\final\egroup%
}
% get random operator
\def\ops{{"+","-","\times","/"}}
\newcommand\randomop{\bgroup\pgfmathsetmacro\op{\ops[int(rnd*4)]}\op\egroup}
% choose random seed
\pgfmathsetseed{\pdfuniformdeviate 10000000}
\pagestyle{empty}
\begin{document}
\foreach \n in {1,...,10}{
$\randomint{-10}{10} \randomop{} \randomint{-10}{10} = $\par
}
\end{document}
结果是:
答案2
另一种方法是:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\foreach \x in {1,...,100}{
\pgfmathparse{int(rand * 11)}
\pgfmathresult, }
\end{document}
答案3
两个问题:
您反复得到相同结果是因为缺少种子。由于您使用的是伪随机数生成器,否则您将得到相同的序列。
生成 -10 到 10 之间的随机整数的一种快速方法是生成 0 到 20 之间的整数,然后将其移动 -10。
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\pgfmathsetseed{\number\pdfrandomseed}
\foreach \n in {1,...,100}{
\pgfmathparse{random(0,20)-10}
\pgfmathresult
}
\end{document}