Judge Some Titrations
Pyth, 35 34 bytes
Input already converted to decimal.
L+O32+eSbhSbf&lt;yTJ495Qf|gyTJ&lt;yT347Q

Test suite.
Previous 35-byte version:
Input already converted to decimal.
L+O32+eSbhSbf&lt;yT495Qf|gyT495&lt;yT347Q

Test suite.
Verify that the third testcase is not the same for each run.
Sample input/output:
input:
[[217, 102, 255], [236, 179, 255], [172, 0, 230]]
output: 
[[217, 102, 255], [236, 179, 255], [172, 0, 230]]
[[172, 0, 230]]

Explanation
(max/255 + min/255)/2 + random[-0.03 .. 0.03] &gt;= 0.94
(max/255 + min/255) + random[-0.06 .. 0.06] &gt;= 1.88
max + min + random[-15 .. 15] &gt;= 479.4
max + min + random[0 .. 31] &gt;= 494.4
max + min + random[0 .. 31] &gt;= 495

(max/255 + min/255)/2 + random[-0.03 .. 0.03] &lt;= 0.65
(max/255 + min/255) + random[-0.06 .. 0.06] &lt;= 1.30
max + min + random[-15 .. 15] &lt;= 331.5
max + min + random[0 .. 31] &lt;= 346.4
max + min + random[0 .. 31] &lt; 347

L+O32+eSbhSbf&lt;yT495Qf|gyT495&lt;yT347Q
                                     @memoized
L                                    def y(b):
 +O32                                    return random(range(32)) +
     +eSb                                b.sort[-1] +
         hSb                             b.sort[0]
            f      Q                 filter for elements in Q as T:
             &lt;yT495                      y(T) &lt; 495
                                     (implicitly printed)
                    f             Q  filter for elements in Q as T
                     |gyT495             y(T) &gt;= 495 or
                            &lt;yT347       y(T) &lt; 347
                                     (implicitly printed)

Before you complain that it calls random three times, hence having inconsistent outputs from the function, note that the function is memoized.
Before you complain that different students with the same colour always produce the same outcome, note that the question never said that the random generator must be independent. It must only be uniform.