Randomization in Matlab Grader
26 次查看(过去 30 天)
显示 更早的评论
If I'm teaching a class with hundreds of students and I don't want them to each have the same problem, is it possible to have each problem be different on a per-student basis? For example if Matlab grader has access to an ID number which is unique to that student then when programming the question I could use that number when generating the student's question, and reference solution. Something like the following, where the guts of ##xxx## gets evaluated to produce numbers which are unique to the student, and shown to the student:
Problem Description and Instructions:
Assign x=##ID%8## and y=##ID%10##
Calculate x/y and assign the result to z.
Reference Solution:
x = ##ID%8##
y = ##ID%10##
z = x/y
0 个评论
回答(2 个)
Alex Pedcenko
2020-6-17
编辑:Alex Pedcenko
2020-6-17
There is a way to achieve some level of individualisation in Grader. Unfortunately it is not possible to generate problem description, which is individual for each student. The workaround is that you can make a list (printed or electronic sheet of sorts), which states parameters of each question for each student.
_________________________
Example:
Question in Grader: Plot a graph of a function y(x) from in your Question 1 (refers to the sheet with values) for N values of x in the the domain of . Values of N, x_min and x_max are individual for each student.
Assign your Student ID number to the variable id.
__________________________
Comment: function y(x), values of N, x_min and x_max are provided to each student individually (e.g. you can make a sheet with their id numbers and list y(x), N, etc for each student id and give the sheet during a test or on Moodle etc. if Grader could generate (or alter) question text based on externally attached script, life could be much easier, but I guess security concerns...
To provide Grader with individual values of y,N.x_min,x_max we can use "Files referenced" section in question specs. We can upload additional m-file or p-file which contains all student id's in an array and other arrays with all other parameters. E.g. I call this file "testit.m" (same as the name of the function inside). The file testit.m is below (not visible to students):
function [ y,n,x_min,x_max ] = testit(student_id)
% functions and id's are stored in cell arrays
% can also load all that from some data file
IDs={'111111','222222','333333'}; % sample student id numbers,
% one of id's (e.g. 1st) can be fake for testing purposes
functions_to_plot={@sin,@cos,@exp_cos}; % functions corresponding to student id numbers
% for the "assessment stage", can be built-in or custom made (see example of custom function below)
% other numerical parameters made individual for each student:
N=[100,200,300];
x_1=[0,-pi,0]; % x_min for plotting
x_2=[2*pi,pi,3*pi]; % x_max for plotting
% finding which id to use
id=num2str(student_id);
index=find(contains(IDs,id)); %searching for id in cell array
if strcmp(cell2mat(IDs(index)),id) % in case only part of ID was used
disp(['ID found: ', id]);
else
index='';
disp('ID not found!');
end
y=functions_to_plot(index); % function for student with given student_id
n=N(index); %
x_min=x_1(index);
x_max=x_2(index);
end
% example of custom function for a student
function y = exp_cos(x)
y = exp(x).*cos(x)
end
Then Referense solution function looks like this:
function [y, x, id, h] = myFunction(id)
if ~exist('id','var') % just to pass "ref. solution validation" stage
id=111111; % should be one of id's in testit.m
end
[func,n,x_min,x_max] = testit(id);
x=linspace(x_min,x_max,n);
% take vector x and evaluate y
y=func{1}(x); % this is the only way I found as "eval" and alike won't work
h=plot(x,y);
end
The learner template:
function [y,x,id,h] = myFunction(id) % lock this line
id='222222'; % Note to student: make sure you define your Student ID here (teacher: leave value of id empty)
%% following lines are as an example solution for this forum: they are not shown to student in actual question
x=linspace(-pi,pi,200); % values for id 222222
y=cos(x); % can also try sin(x) [id=111111] or exp(x).*cos(x) [id=333333]
%%
% assign plot to handle h (optional in case you want to check plot properties, like line style, color etc)
h=plot(x,y); %
"How to call this function" box
% do not change anything in this box
id=0;
myFunction(id);
Finally the Assessment function
% Run learner solution:
[y,x,id,h] = myFunction();
% Run reference solution and get ref. variables:
[yRef, xRef, idRef, hRef] = reference.myFunction(id); % is is the only place where "id",
% provided by the student is actually passed to the ref. function to get the correct solution
% can also extract values from "h" and "hRef", e.g. to check if plot parameters are right
% Compare student result with reference solution:
assessVariableEqual('x', xRef,'Feedback','vector x appear to be wrong');
assessVariableEqual('y', yRef,'Feedback','vector y appear to be wrong');
Now, If one is concerned that student will not use their ID and pass solution validation with ID of their mate. ID should not necessarily be real student ID, they may be some unique strings of random characters pre-generated before the test. In this case all you need to change is just one line in textit.m with cell arrays of used id's.
Also after the test you can obviously check if ID they used is ID they should have used, but the main purpose I guess is to avoid extra work :)
Also testit.m can contain all info for all the questions in the assignment, not just one (may need to use unique variables for parameters of each question though)
7 个评论
Alfonso da Silva Saavedra
2022-12-29
Hi! I found this thread a couple of weeks ago because I wanted something similar to the original question, and, after some approximations using functions, I finally found a solution using scripts.
I published all the code, with some examples, here: https://github.com/alfonsovng/matlab-grader-utils
Cris LaPierre
2020-5-15
编辑:Cris LaPierre
2020-5-21
MATLAB Grader allows you to use random numbers to accomplish what you want. Both the reference and learner solutions share the same seed, so generate the same random numbers.
There are two example problems that do this in the Getting Started with MATLAB Grader problem collection.
- Coordinate transformations Navigating a robot
- Finding a signal through the noise
Typically you would create the variable for the students in the Learner Template and lock that line of code to ensure they do not accidentally change it. You can use this approach to create a scalar, vector or matrix of values for them. Every time they run the problem, the variable will generate new values.
To answer your other questions, MATLAB Grader does not have access to the student id, and does not have the capability to display a variable value in the problem description.
7 个评论
Annie Hui
2021-1-6
I have a similar problem dealing with large classes. Before using Matlab Grader, I would run a program to generate a large random pool of questions. Each question has a unique set of parameters statically embedded within the question itself. I could also generate additional features such as username, course id and embed them within the question. Each question has its own set of numeric answers which I programme into the test pool.
I tried Matlab Grader today, and I'm still trying to find out whether these features could possibly be incorporated into the Grader. Any additional information will be helpful. Thanks in advance.
Jeff Alderson
2021-3-8
Annie, you may want to reach out to your Customer Success Engineer and describe what you are trying to do. We may be able to hep you use some of the randomization and referenced files features of MATLAB Grader to support this today. We would also value learning from you so that we can incorporate these use cases into a future release.
社区
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!