Probably your urng
class is somehow causing an issue, can you confirm that the following code does or does not work?
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
shuffle (foo.begin(), foo.end(), std::default_random_engine(seed));
Also, I don't know what you are programming, but any random number generated in this way is not safe. It will be deterministic and can not be used to protect against people calculating a result for a game in advance or something like this. To learn about how to do random numbers, see How can I generate random numbers inside a smart contract?