ネタ元はコチラ→ http://d.hatena.ne.jp/torikobito/20070521/p1
ふつーにカードを切るのをシミュレートしてみんべ、と。
デッキをカットする、つまりデッキの中ほどからてきとーな枚数抜いてデッキのアタマに回す。
それを何度か繰り返せばシャッフルしたことになるだろと。
目下絶賛こねくりまわしちゅーのSTL/CLRで書いてみた。
#include <cliext/list>
#include <cliext/algorithm>
#include <cliext/iterator>
using namespace System;
using namespace cliext;
int main() {
array<Char>^ data = { L'A', L'1', L'2', L'3', L'4', L'5', L'6',
L'7', L'8', L'9', L'T', L'J', L'Q', L'K' };
list<Char> deck(data);
Random rnd;
for ( int i = 0; i < 10; ++i ) {
// デッキをプリント
for each ( Char card in deck ) { Console::Write(card); }
Console::WriteLine();
// テキトーな範囲 [first,last) を選んで
int x = rnd.Next(deck.size()+1);
int y = rnd.Next(deck.size()+1);
if ( x > y ) { int t = x; x = y; y = t; }
list<Char>::iterator first = deck.begin();
advance(first, x);
list<Char>::iterator last = deck.begin();
advance(last, y);
// その範囲のカードをデッキのアタマに回す
deck.splice(deck.begin(), deck, first, last);
}
}
実行すると↓こんなんなりました。
A123456789TJQK
9TJA12345678QK
5678Q9TJA1234K
34K5678Q9TJA12
7834K56Q9TJA12
834K56Q9TJA712
9T834K56QJA712
A719T834K56QJ2
A719T834K56QJ2
834K56QJA719T2
んー、アルゴリズム遊びはSTLの独壇場だわ♪