Different exam versions, randomly assigned

Sep 21, 2013

Hi, folks - this one is a doozy. I'm doing a sales certification exam for my sales field and channel partners. This is the culmination of 12 different product modules, and a passing grade will be required to do some other cool stuff. Thing is...I know sales guys. Unless they are new, they will not go through the educational modules...the will just try to take the test. So I want to make the exam itself educational. Here's what I want to do:

I have created 3 different versions of a 25 question test - test A, B or C. All are about the same difficulty. When a sales person comes in to take an exam, they should be assigned on of the three versions randomly (so they can't go through the exams together...they are sneaky). If they do not pass the exam, they can review what they missed and where to go for more information...so they can review weak points in their skill set. Then they can retake the test, but I need to be sure that they get one of the other 2 versions; that is, if they took test B first, they will get A or C if they fail B and want to retake.

2 questions: How do I ensure that they are randomly given one of the three tests AND how do ensure if they come back to retake the exam they do not get the same test? Any help appreciated!!!

11 Replies
Kamil Nowek

I had a similar issue and I solved it by Execute Java Script. When you are on the slide before exam (A, B or C) you should draw one number from 1 to 3 (i'm not sure we're able to do it using only SL, I used JS and it works perfectly). And when you click next button, you check which number is drawn and according to this number you go to exam A, B and C. You have to know which exam is running and when you failed this exam, you should draw the next quiz without the quiz which was drawn. I think it is simply to implementation. If you still have problem I'm able to do it with you step by step or send the project with solving. 

Alexandros Anoyatis

Hi Roslyn,

This is called a "Random Grab Bag". The process is a bit tricky, but here are the steps that will do this.

1) Create a text variable, say pool and assign the value "1 2 3".

2) Create a number variable, say test with initial value of 0.

3) On the slide that precedes the test(s) create a layer called redirector.
4) On that layer, create 3 triggers :
Go to slide "Test 1" when timeline starts if value of test==1
Go to slide "Test 2" when timeline starts if value of test==2
Go to slide "Test 3" when timeline starts if value of test==3
5) On the base layer of that slide,create a javascript trigger on the button and paste the following code :

var player = GetPlayer();
var myPool = player.GetVar("pool").split(" ");
var randomKey = Math.floor(Math.random() * myPool.length);
var randomValue = myPool.splice(randomKey,1);
var strToPool = myPool.join(" ");
player.SetVar("pool",strToPool);
player.SetVar("test",randomValue);

6) On the base layer of that slide, create a slide trigger to go to layer redirector when value of variable test changes.
7) At the end of each test, add a trigger to a button that will take the learner back to the slide that precedes the tests.

Additionally, you can create another trigger on the button that uses JS to change the value of Pool to No More Tests! if value of Pool=={blank}, and place this right below the JS trigger.

Hope this helps,
Alex

Roslyn Rissler

Hi, Alex - thanks for the response...I got pulled out of the office, but I'm back now, and I have loads of stupid follow on questions.

1. Should all of the tests be in the same project? Right now, each test is a completely separate Storyline project...this looks like each is a scene in the same project.

2. My other questions are almost too muddled to ask...are there tutorials anywhere that will help me with this? rrr

Ashley Terwilliger-Pollard

Hi Roslyn,

You may want to also PM Alex as I'm not certain he's subscribed to this thread to get notifications. 

In regards to the questions you've asked, it sounds like it should all be one Storyline project if you'd like them to interact with each other. 

In regards to tutorials, there is a basic tutorial here on working with variables, although what Alex is suggesting is a bit more involved.

Roslyn Rissler

Guys, I am so sorry to bug you, but the more I learn about variables, the more lost I am. Here is where I start getting confused, and it's completely because of my lack of knowledge on how to use this awesome tool:

My questions are in CAPS to delineate them from your instructions. For which I thank you and am close to naming my children in honor of.

On the base layer of that slide,create a javascript trigger on the button and paste the following code :

var player = GetPlayer();
var myPool = player.GetVar("pool").split(" ");
var randomKey = Math.floor(Math.random() * myPool.length);
var randomValue = myPool.splice(randomKey,1);
var strToPool = myPool.join(" ");
player.SetVar("pool",strToPool);
player.SetVar("test",randomValue);

ASSUME THIS IS THE BASE LAYER OF THE REDIRECTOR SLIDE? WHAT BUTTON ARE YOU TALKING ABOUT??

6) On the base layer of that slide, create a slide trigger to go to layer redirector when value of variable test changes.

THE BASE LAYER OF THE REDIRECTOR SLIDE? WHERE ALL THIS JS IS LIVING?


7) At the end of each test, add a trigger to a button that will take the learner back to the slide that precedes the tests.

OK, SO THAT WOULD LIVE ON THE RESULTS SLIDE...COULD CALL IT TRY AGAIN. bUT WHAT IF THE USER QUITS OUT OF THE SESSION AND COMES BACK LATER (AFTER STUDYING)?

Additionally, you can create another trigger on the button that uses JS to change the value of Pool to No More Tests! if value of Pool=={blank}, and place this right below the JS trigger.

ON WHICH BUTTON? SORRY DUDE...I'm BAFFLED BY THE BUTTONS!

Thank you for any help... rrr

Alexandros Anoyatis

Hi Roslyn,

Please find my answers in bold, right below your questions.

Ok, lets see :

Roslyn Rissler said: 

On the base layer of that slide,create a javascript trigger on the button and paste the following code :

var player = GetPlayer();
var myPool = player.GetVar("pool").split(" ");
var randomKey = Math.floor(Math.random() * myPool.length);
var randomValue = myPool.splice(randomKey,1);
var strToPool = myPool.join(" ");
player.SetVar("pool",strToPool);
player.SetVar("test",randomValue);

ASSUME THIS IS THE BASE LAYER OF THE REDIRECTOR SLIDE? WHAT BUTTON ARE YOU TALKING ABOUT??

 Yes, this trigger should be inserted on the base layer of the slide that precedes your tests AND should also contain that redirect layer.  

6) On the base layer of that slide, create a slide trigger to go to layer redirector when value of variable test changes.

THE BASE LAYER OF THE REDIRECTOR SLIDE? WHERE ALL THIS JS IS LIVING?

As above, this (listener) trigger and the previous JS trigger should be on the base layer of the same slide. The JS will be triggered when the timeline of the slide starts. After it completes, the numeric value of variable "test" will change, which in turn will trigger the jump to the redirect layer which is responsible for sending the learner to the right test. 


7) At the end of each test, add a trigger to a button that will take the learner back to the slide that precedes the tests.

OK, SO THAT WOULD LIVE ON THE RESULTS SLIDE...COULD CALL IT TRY AGAIN. bUT WHAT IF THE USER QUITS OUT OF THE SESSION AND COMES BACK LATER (AFTER STUDYING)?

Correct: your try again (or whatever you use as a next button on the results slide) should point back to the earlier slide (containing the JS and the redirector). Also, if you set your story to Automatically resume, then all variable values should be retained and they will be able to proceed as if they never left.


Additionally, you can create another trigger on the button that uses JS to change the value of Pool to No More Tests! if value of Pool=={blank}, and place this right below the JS trigger.

 Let's leave this out for now as this only comes into play after the learner fails all three tests!

ON WHICH BUTTON? SORRY DUDE...I'm BAFFLED BY THE BUTTONS!

Thank you for any help... rrr

Pay attention to the initial value of the Pool variable. It should be "1 2 3" (including the spaces, excluding the quotes). It will not work otherwise!

Good luck and let us know how it goes!

Alex

This discussion is closed. You can start a new discussion or contact Articulate Support.