Shuffle list, asegurando que ningún elemento permanezca en la misma posición

Quiero barajar una lista de elementos únicos, pero no hacer una mezcla aleatoria por completo. Necesito asegurarme de que ningún elemento en la lista aleatoria esté en la misma posición que en la lista original. Por lo tanto, si la lista original es (A, B, C, D, E), este resultado estaría bien: (C, D, B, E, A), pero este no: (C, E, A, D, B) porque "D" sigue siendo el cuarto elemento. La lista tendrá como máximo siete elementos. La eficiencia extrema no es una consideración. Creo que esta modificación a Fisher / Yates funciona, pero no puedo demostrarlo matemáticamente:

function shuffle(data) {
    for (var i = 0; i < data.length - 1; i++) {
        var j = i + 1 + Math.floor(Math.random() * (data.length - i - 1));

        var temp = data[j];
        data[j] = data[i];
        data[i] = temp;
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta