Before formulating my answer, I want to adress 2 points which are important.
I wouldn't recommend working with as many objects as your example. There is nothing in your example that cannot be easily achieve with nodes. What if you want to change the slope of your roof ?
Keep in mind that randomness will also produce repetitions. Not a regular one as in your question, but for example 2 adjacent tiles can have the same random value.
Pick random objects from collection
There is one texture which doesn't contain any kind of repetition or regularity : White Noise. By sampling this texture based on the position of the current object, you'll be sure to have different random values as long as no 2 objects have the same location. In that case they would have the same tile, with my answer.
Here is a setup that achieves that. On the left are your few tiles you have modelled, on the right side is your roof.
Warning : your objects will flicker when moving them. Can be uncomfortable or even harmful if you're sensitive to fast changing colors.
The idea is to load all objects from the collection, then get a random ID and delete everything else, based on the Instance index.
Copy Geometry Node to multiple objects
Now, assuming you have your many objects and this node tree on one of them :
- Select all objects that need this Geometry Node
- Have the object with the node tree be active (highlighted by a lighter shade of orange). If it is not already active, just Maj+click this object.
- Then click on the drop-down menu of the modifier, and Copy to Selected
Before copying :
After copying :
Now all of your objects use the same Geometry Node. You can select any of them, they all share the same node tree.