Here's a solution I came up to this many years ago (recreated from old code today):
http://jsfiddle.net/bznfnb2r/1/
Basically, what I do is randomly swap a few of the boxes:
$(function() {
jQuery.extend({
random: function(X) {
return Math.floor(X * (Math.random() % 1));
},
randomBetween: function(MinV, MaxV) {
return MinV + jQuery.random(MaxV - MinV + 1);
}
});
jQuery.fn.swap = function (b) {
b = jQuery(b)[0];
var a = this[0];
var t = a.parentNode.insertBefore(document.createTextNode(""), a);
b.parentNode.insertBefore(a, b);
t.parentNode.insertBefore(b, t);
t.parentNode.removeChild(t);
return this;
}
var numItems = $("#grid .box").length - 1;
for (var i = 0; i < numItems; i++) {
$("#grid .box:eq("+$.randomBetween(0, numItems)+")").swap("#grid .box:eq("+$.randomBetween(0, numItems)+")");
};
});
It's not great, but does do the job.
As I say though, I'd likely do this server side instead.