随机二次方程

随机二次方程

我想生成具有整数系数的二次方程。这是我使用的代码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 代码不能出现在序言中,但是这个问题将在即将发布的下一个版本中得到修复。

相关内容