Hi Kederin,
You could create two List variables: A and B. A contains the available indices, B is empty.
In a loop, you call the Random.Range method with all available indices in A. Then you add the element at the returned index to B and remove the element from A. If necessary, look the List class up in the C# API or elsewhere on the internet.
And for spawning your waves, you use your loop, but instead of accessing the waves list directly, you use the indices stored in B.
To visualise the idea behind A and B:
A[] {
[0]: 0,
[1]: 1,
[2]: 2,
[3]: 3
}
B[] {
[0]: 3,
[1]: 1,
[2]: 0,
[3]: 2
}
Bear in mind that Lists and arrays start at index 0, and the last element in the array is therefore (n - 1) where n is the number of elements/slots.
Good luck! 
See also:
- Forum User Guides : How to mark a topic as solved