我正在尝试为以下操作生成有理数的多项选择问题集:加法,减法,乘法和除法。
像
这样的东西01)2/3 + 5/4的值是:a)b)c)d)e)
02)2/3 * 5/8的值是:a)b)c)d)e)
等约25个问题。我如何使用Mathematica做到这一点?
修改
当我尝试运行yoda的代码并且无法弄清楚原因时,我收到错误。这是错误消息:
这是一个显示我想要的最终输出的模型: http://img827.imageshack.us/img827/7450/imagen2hn.jpg
数字生成很好,但如果它们在-100 < x < 100
间隔内随机会更好。
答案 0 :(得分:3)
我的解释与rcollyer的解释相同 - 你想随机生成25对有理数,并且4对选择是每对{+,-,*,/}
的结果,但是以洗牌的顺序。然后问题是在相应的分数对上单个随机选择的操作。
为了做到这一点,我强烈建议您阅读Sasha's question on generating uniformly distributed rational numbers with an upper bound on the denominator的答案。具体来说,函数RandomFarey
,这是Sasha对btilly的回答的实现。我建议这样做而不是更直观的Rationalize[RandomReal[...]]
方法,因为如果你要为分数设置作业,那么它可能适用于小学/初中课程,你可能不希望任何任意显而易见的方法可能引发的有理数(例如,{273/391, 193/239}
,这可能有点过多,具体取决于级别。)
现在我们有了一个有理数的生成函数,所有需要做的就是生成它们,创建答案选项,改组,创建一组随机问题并整理好。这是一种做法。
makeHomework[n_Integer, denominator_Integer] :=
Module[{rationalPairs = RandomFarey[denominator, 2 n]~Partition~2,
operators = {Plus, Subtract, Times, Divide},
randomOp := RandomChoice[{"+", "-", "\[Times]", "\[Divide]"}],
choiceList, questionList},
choiceList = Outer[Apply, operators, rationalPairs, 1];
questionList = #1 <> randomOp <> #2 <> "=" & @@@
Map[ToString[# // TraditionalForm] &, rationalPairs, {2}];
Grid[Transpose@{questionList,
Row@MapThread[Labeled, {#, {"(a)", "(b)", "(c)", "(d)"}}] & /@
Transpose@choiceList},
Spacings -> {0, 1}]
]
例如,评估makeHomework[5, 10]
会给出:
这可能会占据你90%的路程。我真的很匆忙,所以我还有一些事情没有做,但我希望你或其他人可以解决这个问题。他们大多是微不足道的。
答案 1 :(得分:2)
你能在网格中输入吗?这样的事情:(你没有说你的a,b,c,d应该是什么,如果你澄清一下,我可以更新。我假设你有一些选择可以从某个地方选择。这可以很容易地添加
t1 = "the value of ";
t2 = " is : a) b) c) d)";
a = {"1/2", "3/4", "8/9", "4/3"};
b = {"5/6", "5/6", "9/5", "7/9"};
choice = {"a) b) c) d)"};
r = Table[{i, t1, a[[i]] + b[[i]], t2}, {i, 1, Length[a]} ];
r = Insert[r, {" mid term exam", SpanFromLeft}, 1];
r = Insert[r, {" no cheating allowed", SpanFromLeft}, -1];
Grid[
r,
Frame -> {1 -> True, All}, Spacings -> {.4, 1}, Alignment -> Center
]
修改(1)强>
这里还有一个使用Mathematica生成代数测验问题的演示。可能这可以给OP更多的想法: