Mientras estaba haciendo un seeder, me surgió la necesidad de obtener n registros de una tabla, pero que fueran aleatorios, para crear una serie de transacciones sintéticas, puede ser por ejemplo, que un usuario activo simule comprar n productos de una tienda.

Afortunadamente la solución es sencilla, aunque no obvia, hay que utilizar orderByRaw(), de la siguiente forma:

$productos = App\Producto::orderByRaw('random()')->take(10)->get()

Esto funciona únicamente en Postgres, y quizás otra base de datos cuya función para generar números aleatorios se llame random(). Habrá que adecuarlo a otras bases de datos, por ejemplo, para MySQL hay que usar la función rand() y operará igual.

Como bonus, este es el fragmento del seeder que hice. Simula que un usuario compra un número de entre 1 y 10 artículos distintos al azar, en cantidades que van de uno a cinco unidades:

...
foreach(App\Producto::orderByRaw('random()'->take(rand(1,10))->get() as $producto) {
    App\DetalleCompra::create([
        'user_id'     => $user->id,      // el usuario que compra
        'producto_id' => $producto->id,  // el producto al azar
        'cantidad'    => rand(1, 5),     // entre 1 y 5 items
    ]);
}
...