Select your books, press M, N and input a collection name:
Add a new object, add a Geometry Nodes modifier to it, and drag the collection you just created from the outliner onto your node tree:
Because those objects have a non-zero location (their origins don't sit at the world origin), enable "Reset Children". In either case, also enable "Separate Children", as this allows to instance them separately.
Connect that collection's geometry to the "Instance on Points" node, and enable "Pick instances". For random picking, connect a random value to the "instance index":
Of course if it's just about coloring, not shape, you could:
- Store named attribute on the instances, being the random number controlling the coloring in the shader ("Attribute" node in the shader).
- Use an array modifier, and offset UV in its settings, and control color in the shader based on UV position (if you offset by 1 per each instance, you can take the fraction part for usual UV stuff, and truncated=whole part to pass to a noise texture to get a random number)
- What is the easiest way to have a material randomize the Image textures it uses?