I would make a copy of that array, get random entries from the copy, then remove whichever one I got randomly from it.
Something like:
TArray<int32> copy(otherArray);
while(copy.Num() > 0)
{
int32 index = FMath::RandRange(0, copy.Num() - 1);
//Do whatever with the corresponding entry
copy.RemoveAtSwap(index);
}
This will always visit each one exactly once and you won’t have any wasted loops where you randomly pick an entry that has already been visited. And since you don’t care about the order of the copy you can use the Swap version of RemoveAt so it’s constant time to remove regardless of how big the array gets.