This method uses the array modifier, so you do not have to do any destructive editing to your object.
Here I modeled a single tile and use two array modifiers to make the floor.
Note the two extra vertices (highlighted in red) in the bottom left and top right corners of my tile. They are there to make the space around the tiles. It can be done in the array modifier, but doing it this way makes the nodes much easier (we do not have to worry about scaling the coordinates, or finding magic values).
With the object out of the way, here is the material.
(click for full size)
That all may look complex but it really is rather simple.
First off you have to understand that the generated texture coordinates, go from 0 to 1 across the original object. The texture coordinates just get extrapolated out for the distance of the array modifier. (Which is why you were having the texture go across the whole floor.) In the top part of the node tree, the two Modulo nodes (math nodes with the operation set to Modulo) are what break up the texture coordinates for each tile.
This is what it looks like with just the two Modulo nodes. Very repetitive, but we have tiles, well one tile.
That is half of the problem solved (by just four nodes).
All that is left now is to randomize the location of the texture, so there can be more then one tile.
To add randomness I'm distorting the texture coordinates with a Voronoi texture, but before that I'm distorting its coordinates. (This is the whole bottom part of the node tree.)
The four math nodes, in the blue, are to pixelate the Voronoi Texture so there is only one color per tile. That texture is what adds the variance. The way this works is the texture coordinates driving the voronoi texture get "Rounded" so instead of a nice gradient there is only one value. Thus only one point from the voronoi texture gets used.
Here is what just the voronoi texture looks like after the texture coordinates get rounded.
Now on the other side of the voronoi texture I split the color, and use one channel for each the X and Y.The Math node set to multiply is to get bigger variance. Normally the color goes from zero (black) to one (white). Offsetting the texture by just one would not be enough. The value in this math node does not matter much, but I found it looks best when set to about the size of the array, in my case seven.
Last step is to add the two separate coordinates together (the tiles and the randomness). That is done using a Vector Math node set to add.
Here is the complete blend, minus the duck.