Следующий алгоритм работает довольно хорошо, и не требует дополнительного места для хранения или предварительного перемешивания. Это действительно меняет порядок исходного массива, поэтому, если это неосуществимо, тогда лучше использовать метод предварительного перемешивания.
В псевдокоде:
result = []
For i = 0 to numItemsRequired:
randomIndex = random number between i and source.length - 1
result.add(source[randomIndex])
swap(source[randomIndex], source[i])
В C #:
string[] strAdDetailsID = new string[4];
Random rand = new Random();
for (int i = 0; i < 4; i++)
{
int randIndex = rand.Next(i, adDetailsID.Length);
strAddDetails[i] = adDetailsID[randIndex];
string temp = adDetailsID[randIndex];
adDetailsID[randIndex] = adDetailsID[i];
adDetails[i] = temp;
}