MATLAB, 94 93 bytes
rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
Ejemplo de ejecución (la primera línea después del código es la entrada escrita por el usuario):
>> rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
99
*10001*2*
220001232
*201111*1
*312*1111
12*211000
011211000
0001*1000
000112110
000001*10
Explicación
rng(input(''));
toma un número entero y lo usa como semilla. (Esto funciona en versiones modernas de MATLAB. Las versiones antiguas pueden necesitar una sintaxis diferente).
x(9,9)=~1;
asigna lógico 0u false(obtenido negando lógicamente 1) a la entrada (9,9)de una matriz x. El resto de las entradas también se inicializan automáticamente a lógico 0.
x(randperm(81,10))=1;
asigna 1(automáticamente convertido a lógico 1, o true) a 10las
81entradas de x, elegidas al azar sin reemplazo. Estas entradas son las que contienen bombas.
conv2(+x,ones(3),'s')
es una abreviatura de conv2(+x,ones(3),'same'). Convoluciona la matriz x(que necesita ser convertida double, usando +) con una vecindad de 3 × 3 que contiene 1. Esto cuenta cuántas bombas hay adyacentes a cada entrada. Para las entradas que contienen una bomba, incluye esa bomba, pero el valor allí se sobrescribirá más adelante.
y=[...+48 ''];
agrega 48 al valor, para convertir de número a código ASCII. La concatenación con la matriz vacía convierte estos códigos ASCII en caracteres.
y(x)=42;
asigna 42 (código ASCII para '*') a las posiciones de las bombas. Estas posiciones están dadas por x, que aquí se usa como un índice lógico.
disp(y)
Muestra el resultado.