Antes de nada, bienvenido al blog, se agradecen tanto vuestras visitas como vuestra colaboración.
Vayamos por orden:
La primera duda, mostrar los listados con un orden aleatorio es sencillo, para eso utilizaremos la función RAND de MySQL, para eso, habrá que llamar al find del modelo de la siguiente forma
$this->Modelo->find('all', array('order' => 'RAND()'));
De esta forma, cada vez que actualizases cambiará el orden de los elementos que te muestra.
Esta función no es demasiado eficiente, podrás usarla sin problemas con pocos elementos, pero a la hora de usarla sobre muchos elementos sería mejor utilizar algún modo no tan directo, como ordenar el array con los datos en el controlador antes de pasarlo a la vista.
En cuanto a la segunda duda, para las relaciones N:M, como la del ejemplo que me comentas, cakephp tiene hasAndBelongsToMany.
Se utilizará esta relación ya que cada usuario puede tener muchos amigos y además ser amigo de muchos usuarios.
El funcionamiento es sencillo, habría que crear una tabla intermedia, podremos utilizar la tabla que me indicas en tu post usuario_amigos, esta tendrá tres campos, un id, id_usuario y id_amigo.
Habrá que modificar el modelo usuario para establecer la asociación, será algo como esto:
# class Usuario extends AppModel {
# var $name = 'Usuario
# var $hasAndBelongsToMany = array(
# 'Amigos' =>
# array(
# 'className' => 'Usuario',
# 'joinTable' => 'usuario_amigos',
# 'foreignKey' => 'usuario_id',
# 'associationForeignKey' => 'amigo_id',
# 'unique' => true,
# 'conditions' => '',
# 'fields' => '',
# 'order' => '',
# 'limit' => '',
# 'offset' => '',
# 'finderQuery' => '',
# 'deleteQuery' => '',
# 'insertQuery' => ''
# )
# );
# }
Con esto, al hacer un find de los usuario te aparecerá una lista con sus amigos y también los usuarios de los que es amigo.
El código es orientativo, no lo he probado, por lo que no puedo confirmar que funcione directamente, si tienes algún problema al utilizarlo avisa e intentaré ayudarte.
Espero haber solucionado tus dudas. Un saludo.