#include <algorithm>
#include <iterator>
#include <iostream>

auto generator(unsigned seed)
{
  struct RandomNumberGenerator
  {
  	explicit RandomNumberGenerator(unsigned s): seed(s) {}
  	
    int front()
    {
      return ((seed / 0x10000) * seed) >> 16;
    }
 
    void popFront()
    {
      seed = seed * 1103515245 + 12345;
    }
 
    bool empty() { return false; }
    
  private:
    unsigned seed;
  };
 
  return RandomNumberGenerator(seed);
}

int main()
{
	auto g = generator(5);
	
	std::generate_n(std::ostream_iterator<int>(std::cout, "\t"), 10, [&](){ return g.popFront(), g.front(); });
}