# Randomising without replacement

• Each participant in a survey solves 4 problems.

• For each problem from the 4, participants in a survey solve it with a randomly chosen profile (I have 5 different groups and each group has 5 profiles).

*For example,
Problem 1 with (Group 1, random Profile 1);
Problem 1 with (Group 2, random Profile 3);
Problem 1 with (Group 3; random profile 5);
Problem 1 with (Group 4; random Profile 4);
Problem 1 with (Group 5; random Profile 2)

**For each problem, I do not want a participant to solve a question with a profile twice (i.e. I want to randomise without replacement). For example, a participant cannot solve Problem 1 with (Group 1, random Profile 1) and Problem 2 with (Group 1, random Profile 1). Instead, she can solve it with (Group 1, one of random Profiles 2, 3, 4 or 5).

• Is there a way to ensure that each participant in the survey will not answer a different problem with the same profile?

Thank you very much

by SoSci Survey (308k points)
I am not sure, if I understand the question correctly. What I read: You have 5 x 5 = 25 problems to be solved. These are localted in a matrix of 5 "groups" and 5 "profiles". And now you want to draw 4 from the 25 problems that are from different profiles. Is that correct?
by s247792 (130 points)

To clarify, I have 4 types of questions (e.g. Qa, Qb, Qc, Qd).

Each question is answered based on displaying information of a random profile drawn from each of 5 different groups, without replacement.

So, I have 5 groups. Each group is of size 5, so Group 1 has 5 people; Group 2 has 5 other different people, Group 3 has 5 other different people,..., etc.

For example, for Qa:

answer Qa with (Group 1, random Profile 1);
answer Qa with (Group 2, random Profile 3);
answer Qa with (Group 3; random profile 5);
answer Qa with (Group 4; random Profile 4);
answer Qa with (Group 5; random Profile 2)

For "Qb Group 1", I do not want the person taking the survey to have a profile that they have already seen before in "Qa Group 1" (hence without replacement).

Another example: for "Qc Group 2", I do not want the person taking the survey to have a profile that they have seen before in "Qa Group 2" and "Qb Group 2".

Hope this is more clear?

by SoSci Survey (308k points)

Thanks for the clarification. I now understand that you need all 5 profiles for Question Qa. And then again in Question Qb, but you need to ensure that the profile is always a different one.

So, what you actually need is different rotations of the profile order (there are 5! = 120 possible rotations), but the number of possible orders is limited in each iteration, i.e., you have only 4! = 24 possible rotations for Qb (given the Qa order) and only 3! = 6 for Qc.

The only option I see here, is to solve this programatically. That is: Do the first rotation (Qa), then define what profiles are left for each group for Qb, and so on. The challenge is that you have two restrictions at once/at cross (unique per profile, and unique per question), and while I am sure that there is an efficient algorithm for that, I do not know that one currently.

What I can offer is solution that will use 120 of the possible 120 24 6 * 2 = 34.560 possible combinations.

``````// Define the profiles
\$profiles = [1,2,3,4,5];
// Build a matrix with a valid solution
\$matrix = [];
for (\$x=0; \$x<5; \$x++) {
\$matrix[\$x] = [];
for (\$y=0; \$y<5; \$y++) {
\$matrix[\$x][\$y] = (\$x + \$y) % 5;
}
}

// Now shuffle rows
\$order = [0,1,2,3,4];
shuffle(\$order);

// Resort matrix (1)
\$matrix2 = [];
for (\$x=0; \$x<5; \$x++) {
\$matrix2[\$x] = [];
}
foreach (\$order as \$old => \$nw) {
for (\$x=0; \$x<5; \$x++) {
\$matrix2[\$x][\$old] = \$matrix[\$x][\$nw];
}
}
\$matrix = \$matrix2;

// Now shuffle columns
\$order = [0,1,2,3,4];
shuffle(\$order);

// Resort matrix (2)
\$matrix2 = [];
foreach (\$order as \$old => \$nw) {
\$matrix2[\$nw] = \$matrix[\$old];
}
\$matrix = array_values(\$matrix2);

debug(\$matrix);
``````

Store that matrix in internal variables, and use them to select the profiles in question Qa (that would be `\$matrix[0]`), Qb (that would be `\$matrix[1]`), etc.