Update assign to work with C++14 and up
Uses the std::shuffle() algorithm and Mersenne Twister that was introduced in C++11
Make sure to initialize it with the same random seed used with plain ol' rand() so that we can still get deterministic behavior from assign when we want.