かき混ぜてはいかがでしょうかのつづき...ってゆーか、
ラムダがあんまりおもろいもんで、遊んでみたかっただけさ。
#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <list>
namespace std { using namespace std::tr1; }
int main() {
const int N = 20;
typedef std::list<int> container;
container data(N); // 要素数Nのコンテナ
int i = 0;
// 1..Nで埋める
std::generate_n(data.begin(), data.size(), [i]() mutable { return ++i; });
// シャッフル前
std::cout << "\nbefore : ";
std::for_each(data.begin(), data.end(), [](int item) { std::cout << std::setw(3) << item;});
std::mt19937 mt; // メルセンヌ・ツイスター
std::uniform_int<> dist; // 一様分布
// ネタ元とおんなじアルゴリズム
container::iterator tail = data.end();
for ( int size = data.size(); size != 0; --size ) {
// "size未満の乱数"番目と末尾要素とを入れ替える
container::iterator position= data.begin();
std::advance(position,dist(mt,size));
std::iter_swap(position, --tail);
}
// シャッフル後
std::cout << "\nafter : ";
std::for_each(data.begin(), data.end(), [](int item) { std::cout << std::setw(3) << item;});
}