$\hspace{15pt}$Using sorting nodes like Points of Curve works perfectly and results in simple node trees, but as domain size increases, like thousands of indices and more, sorting will slow down significantly, so if anyone wants faster methods for these cases, I recommend the methods provided in this answer.
$$\text{Pick Discard Repeat (PDR)}$$
$$\text{Timing comparison}\\\tiny{_\text{made on my potato laptop}}$$
$\hspace{15pt}$ • 2.5 K points
Native Sorting:
PDR Shuffle (4 steps):
$\hspace{15pt}$ • 10 K points
Native Sorting:
PDR Shuffle (4 steps):
$$\text{How it works}$$
$\hspace{15pt}$The nodes are separated in three node groups, one which can be chained for more steps.
$\hspace{15pt}$Generates the initial point cloud storing all indices as available indices. Their positions is set to $(0, 0, i_{ndex})$ and their IDs are set to their indices.
$\hspace{15pt}$For points in Available Indices, set their ID to the ID of a random point and then, for points with repeated IDs, leave only one per ID by deleting all of the others. After that set their position to $(0, 0, I_D)$ and join them to Shuffled Indices before outputting in the Shuffled Indices socket.
$\hspace{15pt}$Also for points in Available Indices, remove all points whose IDs had been picked in the process above before outputting the result in the Available Indices socket, this is done using the Geometry Proximity node, which is why point positions are being set to $(0, 0, I_D)$.
$\hspace{15pt}$If any remaining available indices, sort them with random weights ('Native Sorting') and join to Shuffled indices.
$\hspace{15pt}$The resulting point cloud is from where ID will be sampled using the index of the current context (The geometry and domain that are using the shuffled indices output).
$\hspace{15pt}$ I also added another output called Pointed By, which has the index that got the current index after shuffling.
$_\text{Blender 3.6 (but can be opened on 3.4)}$
Update: The Separate and Rejoin method pointed by Robin Betts is many times faster than PDR with hundreds of thousands of indices, since it does not depend on distance calculation nodes like Geometry Proximity.
$$\text{Separate and Rejoin}$$
$$\text{Timing comparison}\\\tiny{_\text{also made on my potato laptop}}$$
$\hspace{15pt}$ • 100 K points
PDR (4 steps):
Separate and Rejoin (8 steps):
$$\text{How it works}$$
$\hspace{15pt}$Like PDR, Separate and Rejoin operates with three different node groups, one which can be chained for more steps.
$\hspace{15pt}$Generates the initial point cloud setting their IDs are to their indices.
$\hspace{15pt}$Selects random points and move them to the end of the domain, this action is performed by separating them and then appending to the unselected points with the Separate Geometry and Join Geometry node.
$\hspace{15pt}$From the shuffled points, samples the ID attribute at the current index.
$\hspace{15pt}$ The only disadvantage compared to PDR, is that you cannot use Native Sorting to randomize indices that weren't shuffled, the cause is that Separate and Rejoin operates on all points in every step, increasing disorder of all.
- 100K points, 4 steps. (Second image is displaying UV of index which has a shuffled index equal to the current index)
$\hspace{15pt}$ But, with Blender 4.0, with Repeat zones, the number of steps could be made to depend on the number of indices.
For me, $\lceil\ln{T}\rceil$, where $T$ is the index count, already gives a good number of steps. For PDR, $\lceil\frac{\ln{T}}{2}\rceil$;
$_\text{Blender 3.6 (but can be opened on 3.4)}$