Procedural random/different colors based on normal direction
Technique #1

A psuedo-random color can be assigned to a range of normals (needed if there are small variations in face normals) and stay with the object as it rotates. The normal vector for the object faces is transformed to local coordinated, then rounded, then passed through a noise texture, and finally a color ramp.

For the sample model in the question, the geometry for the lights was separated from the original mesh and simplified so the faces for the light were approximately flat. To illustrate how the colors are assigned based on normals, a sphere with random colors is shown along with the disco ball.





Solution (tested on 2.79)


Create a shader for the random face colors. The input will be the geometry node followed by the vector transform node. The vector transform node allows the object to be rotated without the normal changing (See Cycles normal input relative to object&#39;s rotation ).





Add logic to the shader to quantize the normal values for x,y, and z. The values for x,y, and z are rounded so they have a fixed number of values. The input at the bottom controls how many different levels of normal values are considered. This keeps faces that are almost flat a single color. 





Changing this value changes the number of normal ranges that will result in a unique color. 
For a value of 2 

For a value of 10

For a value of 100

Finally, the quantized normal is input into a noise texture, then through a color ramp and to an emissions shader.





Putting it all together, the complete shader is shown below.





The geometry as shown in the question needed one change for this to work as expected. The lights mesh needed to have flat areas for the colors. The way the geometry was created, results in curvature around the edges of the lights which results in small areas with different normals. Applying this shader as-is to those areas, resulted in unwanted artifacts.





By separating this mesh and removing the modifiers, the light meshes are flat and get a single color.








An example blend file: 





Technique #2

The advantage of this technique is that a texture can be used to assign the colors to the normals. A psuedo-random color can be assigned to faces with unique normals by converting the normal to spherical coordinates, then using a procedural noise texture and color ramp to set the colors.





Solution (tested on 2.79)


The key to make this work is to convert the normal for face from a vector into two angled using spherical coordinates (see Wikipedia - spherical coordinates). To do the conversion, the atan2 function is needed, but not available in 2.79, so this is done using math and the arctangent function (see atan2 in Blender).





The spherical coordinates are converted into a value between 0 and 1 by scaling using radians.





The coordinated are used as a lookup into a texture. To test the mapping the default blender UV texture is used. Using smooth shading on a sphere shows the mapping works as expected. The colors for the faces can be assigned using an image texture.





To procedurally assign the colors, a noise texture is used. The spherical coordinates are input to the noise texture. Using the default settings, the colors are not independent and blend together.






Changing the settings helps make every face's normal have a  difference color.






Finally, a color ramp can be used to control the colors assigned. Add a color ramp between the noise texture and the shader. The output of the noise texture is scaled to use all of the range of the color ramp.






The complete procedural shader for this is shown below.






Sample blend file -