일반적으로 카드 덱을 섞은 방법을 힌두셔플이라고 한다고 들었다.
그를 코드로 작성해보았다.
힌두 셔플의 원리는 다음과 같은데,
덱의 아래에서 n장을 덜어서 위로 올린다.
그 올린 n장 중 m(m<n)장을 덜어서 위로 올린다.
카드가 없을 때까지 반복한다.
point는 손에 잡은 카드의 총 양을 얘기하는데,
처음엔 52장 중에서 s1만큼 덜어서 위로 올리면,
두번째 과정에선 s1 중에서 s2 만큼 덜게되기 때문에 재귀방식을 이용했다.
void HinduShuffle(List<string> deck, int point)
{
Random random = new Random();
int s = random.Next(0, point);
if (s == 0) return;
List<string> tmpDeck = deck.ToList();
for(int i = 0; i<point; i++)
{
int less = point - s;
if (less + i < point)
{
deck[i] = tmpDeck[less + i];
}
else
{
deck[i] = tmpDeck[i - s];
}
}
HinduShuffle(deck, s);
}