Cycles nodes: is there a way to find coordinates change, derivative, direction?
Not strictly an answer to your question, but.. 

To get a random value per face to be read by Cycles, you could use an adaptation
of Chebhou's answer to this question.

Run this script on the active object:

import bpy
import random

obj = bpy.context.object
obj_data = obj.data
group_name = 'face_ID'

#check for existing group with the same name
if None == obj_data.vertex_colors.get(group_name): 
    obj_data.vertex_colors.new(name=group_name)
color_map =  obj_data.vertex_colors[group_name]

for poly in obj_data.polygons:
    rnd=random.random()
    color = (rnd, rnd, rnd,0)
    for loop_ind in poly.loop_indices:
        color_map.data[loop_ind].color = color 


and then use the Cycles 'Attribute' node to retrieve the generated vertex color layer by name:



result of this example on a subdivided plane:



I've moved the randomization into the script - I was having trouble getting a good pseudo-random number out of  a 0.0-1.0 input range using nodes. If nobody points out something obvious in a comment, I'll post that as another question.