Reordenar elementos de Array aleatoriamente y sin repetir

Hola!

Tengo un array en JavaScript llamado equipos, que tiene 8 elementos. Lo que quiero es reordenar aleatoriamente esos 8 elementos, es decir, tengo este array:
equipos[0] = "Equipo 1";
equipos[1] = "Equipo 2";
equipos[2] = "Equipo 3";
... así hasta 8 ...

Y con un for muestro todos los equipos:
for(x = 0; x <= equipos.length; x++){
  console.log(equipos[x]);
}

Lo que quiero es, aleatoriamente y sin que se repitan, desordenarlos para que se muestre por ejemplo "Equipo 2, Equipo 8, Equipo 3, Equipo 1..." en vez de mostrarlos ordenados.
Cómo podría hacerlo?

Saludos!
Hola @skaparate, muchas gracias por responder otra vez :p
Perdona por no contestar este tiempo pero estoy bastante liado.

La primera opción me generó esto en la consola:


La segunda forma (la que decías que no sabías si era más rápida) me generó esto: [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
Que extraño... ¿qué información utilizaste: la de las pruebas que yo puse u otra? Te lo pregunto porque yo lo probé y funcionaba sin problemas :P. Muéstrame cómo lo usaste para ver en que nos equivocamos :).

Saludos!

PD: modifiqué una parte del código, al comienzo de la función arrayShuffle (no es nada importante en realidad, sólo se asegura de que le pasen un array y no otra cosa).
Lo intenté utilizar con mi código, pero de seguro está mal XD.
Obtengo el valor de cada div para guardar el nombre de los equipos en un array (ya que el usuario los escribe y se modifican en tiempo real mediante keydown de jQuery):
$(document).ready(function(){
    
// Listar equipos
var equipos = [];
for(x = 0; x <= 8; x++){
  equipos[x] = $("#cuartos-" + x).html();
}

function arrayShuffle(array, min, max) {
        if(!typeof array === "array")
                return array;

	if(min === undefined)
		min = 0;
		
	if(max === undefined)
		max = array.length - 1;

	var i = 0;
	var arrayLen = array.length;
	var randomInt = -1;
	var tmp = new Array();
	var tmpIdx = -1;
	var tmpVal;
	
	for(; i < arrayLen; i++) {
		do {
			randomInt = getRandomInt(min, max);
			console.log('Random int: ' + randomInt);
		} while(tmp.indexOf(randomInt) != -1);
		
		tmp.push(randomInt);
		tmpIdx = i;
		tmpVal = array[i];
		array[i] = array[randomInt];
		array[randomInt] = tmpVal;
	}
	
	return array;
}

// Créditos para esta función: https://gist.github.com/kerimdzhanov/7529623
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min);
}// Generar encuentros aleatorios
generar_encuentros = function() {
  console_log(arrayShuffle(equipos));
  for ( a=0; a<=8; a++ ) {
    $("#cuartos-" + a).html(equipos[a]);
  }
}

});
Hmmm, yo intenté con esto y también funcionó:

<html>
	<head>
		<script src="jquery-1.11.2.min.js"></script>
		<script src="array.shuffle.js"></script>
		<script>
			/*var a = ['uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho'];
			console.log(arrayShuffle(a));*/
			jQuery(document).ready(function($) {
				var a = [];
				
				$("#parent").children().each(function() {
					a.push($(this).text());
				});
				
				console.log(arrayShuffle(a));
			});
		</script>
	</head>
	<body>
		<div id="parent">
			<div>Equipo 1</div>
			<div>Equipo 2</div>
			<div>Equipo 3</div>
			<div>Equipo 4</div>
			<div>Equipo 5</div>
		</div>
	</body>
</html>

Consola Google: ["Equipo 3", "Equipo 5", "Equipo 4", "Equipo 1", "Equipo 2"].

También lo intenté de otras formas y funcionó. Yo creo que tiene que ver con el evento keydown, que quizás no se alcanza a ejecutar por completo y tiene que reordenar el array. Otra cosa quizás se la visibilidad del array equipos, depende de dónde se utilice; quita la palabra clave var al array equipos y ve si funciona.
Puse todo el código en un hosting online para que puedas ver todo (y si a alguien le sirve lo que viene a ser la tabla de clasificación que la utilice si quiere XD): http://torneout.260mb.net

Probaré a hacer algunos cambios y ponerlo como me dijiste y te comento. Gracias por todo!
Yo veo que funciona, no? O sea, los equipos se desordenan al hacer clic sobre generar encuentros aleatorios.

Tal vez no es el comportamiento que esperabas? :P
Parece que ya lo resolvieron, bueno yo les presento otra solucion, en la que no se desordena el arreglo sino un arreglo numerico desde el 0-7 para los 8 equipos, creo que es mucho mas simple que los que se an posteado aqui, pero para fines ilustrativos que aqui quede.

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8" />
</head>
<body>

<script>
var lista = [0,1,2,3,4,5,6,7];
var equipos = [];
equipos[0] = "Equipo 1<br>";
equipos[1] = "Equipo 2<br>";
equipos[2] = "Equipo 3<br>";
equipos[3] = "Equipo 4<br>";
equipos[4] = "Equipo 5<br>";
equipos[5] = "Equipo 6<br>";
equipos[6] = "Equipo 7<br>";
equipos[7] = "Equipo 8<br>";

lista = lista.sort(function() {return Math.random()-0.5});

for(x = 0; x < lista.length; x++){
  document.write(equipos[lista[x]]);
}
</script>

</body>
</html>

Lo importante aqui es el orden aleatorio del arreglo de indices por asi llamarlo (lista).
Me acabo de fijar en una cosa, que era el culpable de que se repitiera siempre uno... los nombres de cada id eran cuartos-1, cuartos-2... y en los "for" empezaba en 0 por el array, y claro, el id cuartos-0 no existía cuando debería ser lo que era el "cuartos-1". Lo cambié y apliqué el método de serverdns que funciona perfectamente y ocupa muy poco espacio en el código... por eso el último código de skaparate no me funcionaba a mí pero sí funcionaba con ese código de prueba... que tontería jajaja.

Muchas gracias a los dos por vuestro tiempo y ayuda!
Ah que bueno! La solución de serverdns es mucho mejor que la mía, puesto que utiliza las funciones nativas, que son más rápidas. En el caso de que hayan pocos equipos no hay problema, pero si hay miles, entonces se podrá lento, por lo que la solución de serverdns sería mejor.

Saludos!