It may be helpful if you could strip down your code to a minimal example. Right now it is hard to grasp what all of the variables are for without spending a decent amount of time looking through all the files.
I did take a quick look, though, and my initial impression is that the math in TileMap::create() doesn't seem right.
int tu = tileNumber % ( _texture.getSize().x / _textureSize.x );
int tv = tileNumber / ( _texture.getSize().x / _textureSize.x );
First of all, I'm assuming texture.getSize().x is the width of the entire tilemap texture and _textureSize.x is the width of a single tile. If you are wanting to randomly pick tiles in the manner you talked about in your first post, what is tv supposed to be for? It seems like tileNumber should only contain a value between 0-2 inclusive (because your tilemap has 3 tiles horizontally on the first line). Do you allow your level to specify tiles other than ones on the first line? If so, that may complicate things. If not, then I don't see how tv will ever equal anything other than 0.
quad[0].texCoords = sf::Vector2f(tu * _textureSize.x, tv * (_textureSize.y + createVariation(i, j)));
quad[1].texCoords = sf::Vector2f((tu + 1) * _textureSize.x, tv * (_textureSize.y + createVariation(i, j)));
quad[2].texCoords = sf::Vector2f((tu + 1) * _textureSize.x, (tv + 1) * (_textureSize.y + createVariation(i, j)));
quad[3].texCoords = sf::Vector2f(tu * _textureSize.x, (tv + 1) * (_textureSize.y + createVariation(i, j)));
Why are you calling createVariation() for each corner of the quad. Shouldn't you just call it once and use that value for all 4 corners. I'm also, again, not sure what tv is for. Shouldn't that y value just be something like
variation * _textureSize.y
or
(variation + 1) * _textureSize.y