我想生成具有整数系数的二次方程。这是我使用的代码pgfmath
。
\documentclass{article}
\usepackage{tikz}
\pgfmathsetseed{\pdfuniformdeviate 10000000}
\begin{document}
$\pgfmathdeclarerandomlist{signe}{{+}{-}}%
\pgfmathrandomitem{\s}{signe}%
\pgfmathparse{random(2)}%
\pgfmathparse{ifthenelse(\pgfmathresult==1,"-"," ")}\pgfmathresult
\pgfmathrandominteger{\a}{1}{6}
\pgfmathparse{ifthenelse(\a==1," x^{2} ","\a x^{2}")}\pgfmathresult % coeff a
\pgfmathdeclarerandomlist{lincoeff}{{}{2}{3}{4}{5}{6}}
\pgfmathrandomitem{\b}{lincoeff}%
\pgfmathrandomitem{\s'}{signe}%
\pgfmathsetmacro{\e}{random(0,6)}
\pgfmathparse{ifthenelse(\e==0," ", " \s' \b x ")}\pgfmathresult % coeff b
\pgfmathrandominteger{\c}{0}{6}
\pgfmathrandomitem{\s''}{signe}%
\pgfmathparse{ifthenelse(\c==0,"","\s'' \c")}\pgfmathresult % coeff c
=0$
\end{document}
它有效,但似乎不是一个好方法,我对 x 系数有些困惑,而且我的解决方案看起来很复杂。我尝试在ifthenelse
内部使用一个ifthenelse
,但没有成功。有没有更好的方法?
答案1
有很多如果 :)
\documentclass{article}
\usepackage{tikz}
\pgfmathsetseed{\pdfuniformdeviate 10000000}
\newcommand{\rndcoeff}[1][1]{
\pgfmathrandominteger{\a}{\ifnum#1>1 1\else0\fi}{6}
\ifnum#1>1
\pgfmathparse{rand>0?:"-"}\pgfmathresult\ifnum\a=1\else\a\fi x^2
\else
\ifnum#1<1\relax
\ifnum\a>0\relax
\pgfmathparse{rand>0?"+":"-"}\pgfmathresult\a
\fi
\let\a\relax
\else
\ifnum\a>0\pgfmathparse{rand>0?"+":"-"}\pgfmathresult\ifnum\a=1\else\a\fi x\fi
\fi
\fi
}
\newcommand{\givemesomequads}{
\rndcoeff[2]\rndcoeff\rndcoeff[0] = 0
}
\begin{document}
\foreach \x in {1,...,10}{
$\givemesomequads$ \par
}
\end{document}
答案2
嗯,这是一个pgf
仅适用于随机整数的解决方案。
其余一切都是通过 TeX 自己的条件和一个循环(在一个实例中)来完成的。
代码
\documentclass{article}
\usepackage{pgf}
\pgfmathsetseed{\pdfuniformdeviate 10000000}
\newcommand*\MakeFirstTerm[2]{
\loop\pgfmathrandominteger{\a}{#1}{#2}
\ifnum\a<0\relax
\let\iterate\relax
\else\ifnum\a>0\relax
\let\iterate\relax
\fi
\repeat
\ifnum\a=1\relax\else
\a
\fi
}
\newcommand*\MakeTerm[3][]{
\pgfmathrandominteger{\a}{#2}{#3}
\ifnum\a=0\relax\else
\ifnum\a<0\relax\else+\fi
\a#1
\fi
}
\newcommand*{\quadeq}{
\MakeFirstTerm{-6}{6}x^2 \MakeTerm[x]{-6}{6} \MakeTerm{-6}{6} = 0
}
\begin{document}
$\quadeq$ \par $\quadeq$ \par $\quadeq$ \par $\quadeq$ \par $\quadeq$
\end{document}
输出
答案3
这是一对 lualatex 解决方案。两者都提供了\genrand
一个可选的整数参数,该参数指定系数的最大(绝对)值,默认值为 10。第一个使用模式匹配,第二个是标准方法的一个有点奇怪的变体。
模式匹配:
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
local rand = math.random
function makequad(n)
n = n or 10
local a,b,c = rand(-n,n),rand(-n,n),rand(-n,n)
while a==0 do a = rand(-n,n) end
local s = a.."x^2".."+"..b.."x".."+"..c
s = string.gsub(s,"%+%-","-")
s = string.gsub(s,"[%D]0[^%d]?","")
s = string.gsub(s,"([+-])1x","%1x")
s = string.gsub(s,"^([%D]?)1x","%1x")
tex.sprint(s.."=0")
end
\end{luacode*}
\newcommand\genquad[1][]{\directlua{makequad(#1)}}
\begin{document}
$\genquad$\par
$\genquad[20]$
\end{document}
标准方法的奇怪变化(我试图变得聪明):
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
local rand = math.random
local function zapone(n)
if math.abs(n)==1 then
n = ""
end -- if
return n
end -- function
local function gensign(x)
local n = rand(1,2)
if n > 1 then
return "-"
elseif x == nil then
return ""
end -- if
return "+"
end -- function
function makequad(n)
n = n or 10
local a,b,c = rand(1,n),rand(0,n),rand(1,n)
if b==0 then
tex.print(gensign()..zapone(a).."x^2"..gensign(1)..c.."=0")
else
tex.print(gensign()..zapone(a).."x^2"..gensign(1)..zapone(b).."x"..gensign(1)..c.."=0")
end -- if
end -- function
\end{luacode*}
\newcommand\genquad[1][]{\directlua{makequad(#1)}}
\begin{document}
$\genquad$\par
$\genquad[20]$
\end{document}
答案4
这是一个使用的解决方案PythonTeX。如果您需要的只是随机二次方程,那么 lualatex 和 pgf 解决方案可能更好。但如果您最终要处理方程式,那么访问 Python 的 SymPy 符号数学库可能会很有用。这种方法的一个优点是代码非常紧凑,因为 SymPy 为我们完成了所有工作。
\documentclass{article}
\usepackage{pythontex}
\begin{document}
\begin{sympycode}
from sympy.stats import DiscreteUniform, sample
x = Symbol('x')
a = DiscreteUniform('a', range(-10, 11))
b = DiscreteUniform('b', range(-10, 11))
c = DiscreteUniform('c', range(-10, 11))
def randquad():
return Eq(sample(a)*x**2 + sample(b)*x + sample(c))
\end{sympycode}
\newcommand\randquad{\sympy{randquad()}}
\[ \randquad \]
\[ \randquad \]
\[ \randquad \]
\end{document}
目前,Python 代码不能出现在序言中,但是这个问题将在即将发布的下一个版本中得到修复。