Estaba buscando como resolver unos problemas y aprendiendo python (ya que puedo programar en android con QPython) asi que decidi hacer un metodo para generar tableros validos de sudoku, se genera un tablero original y con desplazamientos se lleva a la posición generada segun la semilla... la semilla genera (teoricamente) 60466175 tableros unicos
Si cualquier duda avisen 
import pprint
#crea array bidimensiona
def create_matrix(m, n): return [[0]*n for _ in xrange(m)] 
#gira la matriz ccw 
def rotar_matrix(matrix):
  matrix_auxiliar = create_matrix(9,9)
  for x in range(9):
    for y in range(9):
      matrix_auxiliar[y][x] = matrix[x][y]
  return matrix_auxiliar 
def generar_tablero(semilla):
  #se genera un sudoku base sobre el que aplicar transformaciones 
  basesudoku = create_matrix(9,9)
  for y in range(9):
    for x in range(9):
      basesudoku[y][x]= (x+(y%3)*3+(y/3))%9+1
  #declaracion e inicializacion de variables
  #variables de transformacion
  #desplazamiento del 0 al 8
  desplazamiento = 0
  #rotacion del 0 al 3
  rotacion = 0
  #combinacion cada elemento del 0 al 5
  combinacion = [0,0,0,0,0,0,0,0]
  #numero generatriz de 0 60466175
  desplazamiento = semilla%9
  semilla /=9
  rotacion = semilla%4
  semilla /=4
  for i in range(8):
    combinacion[i] = semilla%6
    semilla /= 6
  #sudoku final
  sudoku = create_matrix(9,9)
  #auxiliar para copiar elementos
  auxiliar = create_matrix(3,9)
  #posibles combinaciones de 3 elementos
  combinatorias = create_matrix(6,3)
  combinatorias = [[0,1,2],[1,2,0],[2,0,1],[1,0,2],[0,2,1],[2,1,0]]
  #combinacion para cada elemento segun combinacion escogida
  combinador = create_matrix (8,3)
  for i in range(8):combinador[i] = combinatorias[combinacion[i]]
  #modificacion de matriz por desplazamiento lateral con desp
  for y in range(9):
    for x in range(9):
      sudoku[y][x] = basesudoku[y][(x+desplazamiento)%9]
  #mecla lineas de 3 en 3 segun combinacion 
  for z in range(3):
    for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
    for y in range(3):
      sudoku[z*3+y] = auxiliar[combinador[z][y]]
  #se copia sudoku en auxiliar
  auxiliar = sudoku[:]
 
  #se mezclan los 3 renglones mayores 
  for z in range(3):
    for y in range(3):
      sudoku[z*3+y] = auxiliar[combinador[3][z]*3+y]
  #se rota la matriz para aplicar conversiones en otro eje
  sudoku = rotar_matrix(sudoku)
  #se repite el proceso
  for z in range(3):
    for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
    for y in range(3):
      sudoku[z*3+y] = auxiliar[combinador[z+4][y]]
  auxiliar = sudoku[:]
 
  for z in range(3):
    for y in range(3):
      sudoku[z*3+y] = auxiliar[combinador[7][z]*3+y]
  #se endereza la matriz a su orientacion original 
  for i in range(3): sudoku = rotar_matrix(sudoku)
  #se le da la orientacion indicada en rot
  for i in range(rotacion): sudoku = rotar_matrix(sudoku)
  return sudoku
pprint.pprint( generar_tablero(0) )
[Elektro]: Título corregido, ponía "odigo" :P
			
			
			
				Se puede generar nuevos SUDOKU con Octave o Matlab con un algoritmo de no mas de 20 lineas de código. Este algoritmo consiste en partir de un SUDOKU completado -81 casillas completas- y desde este se generan tantos como se quiera x simple eliminacion de n casillas elegidas al azar. Es decir de una solucion se pasa x eliminacion a otro tablero para solucionar. Realmente este algotitmo se puede hacer con cualquier lenguaje d programación pues no tiene pretensiones de ningun calculo matem´tico.
			
			
			
				es raro ver un aporte tuyo .  :P , se agradece.  ;)