PennController for IBEX › Forums › Support › Pseudo-randomising stimulus presentation › Reply To: Pseudo-randomising stimulus presentation
Hi Zoë,
I answered a similar question on the original Ibex forums: https://groups.google.com/d/msg/ibexexperiments/1987FoZKo6k/XAw_XoX3AQAJ
You should upload a .js file to the Controllers folder that contains the following code:
function RandomizeNoMoreThan(predicate,n) {
this.args = [predicate];
this.run = function(arrays) {
let moreThanN = true;
let order;
while (moreThanN){
order = randomize(predicate).run(arrays);
moreThanN = false;
let previousType = "";
let current_n = 0;
for (let i = 0; i < order.length; i++){
let currentType = order[i][0].type;
if (currentType != previousType){
current_n = 1;
previousType = currentType;
}
else{
current_n++;
if (current_n > n){
moreThanN = true;
break;
}
}
}
}
return order;
};
}
function randomizeNoMoreThan(predicate, n) {
return new RandomizeNoMoreThan(predicate,n);
}
Then in your main script you can do this:
Sequence("intro", randomizeNoMoreThan(anyOf("1A", "1B", "1C", "2A", "2B", "2C"),2), "exit")
Be very careful with it though, as it will freeze in an infinite loop if you don’t have enough items with each label to consistently break series of N items sharing the same label. For example, if you have 90 “1A” items but only a total of 10 items across the other labels, there is no way of avoiding series of more-than-two “1A” items and so your experiment would end up crashing.
Jeremy