What is the easiest way to have a material randomize the Image textures it uses?
As long as all the books are separate objects, we can use the Random output of the Object Info node.

That gives us a random value (per object) ranging from 0 to 1 (black to white):



All we need to do then is tell it to use different materials for different value ranges. I'm sure there are many ways to do this, but here's the first I could think of:

We can add two math nodes with the operations on Greater Than and Less Than, setting the bottom socket values to encapsulate a certain range (e.g: between 0.1 and 0.3) and plugging the Random output into the top sockets. Then multiply the two math nodes and you'll have a mask showing white on the books where the random value is between that range:



Then we can connect that mask to the Fac of a MixRGB node, and thus the first socket of the mix node would be the original colour, and the second socket would be whatever colour/texture you want to show in the value range.

Since you'll be using that same node set-up over and over again for each texture, it's a good place to turn it into a node group:





And thus by chaining a few of these groups together, you can easily randomise the colours/textures of objects with that material: