Код:
procedure TForm1.Button1Click(Sender: TObject);
var x,y, xi,yi,i,p :integer;
c: boolean;
begin
i:=0;
repeat
c:=false;
P:=10; // Размер грида
x:=random(p-1);
Y:=random(p-1);
for xi:=-1 to 1 do
for yi:=-1 to 1 do
if (x+xi>=0) and (y+yi>=0)and (x+xi<p) and (y+yi<p) then
if stringgrid1.Cells[x+xi,y+yi]<>'' then c:=true; //проверяем пустое поле
if c = false then stringgrid1.Cells[x,y]:='1';// если пустое вписываем 1
if c = false then inc(i);// считаю кол-во заполненных
until (I=10);
end;
Еще неплохо бы написать проверку свободных мест, то есть если свободные места заканчиваются выдавать мессадж. А то программа войдет в бесконечный цикл.
Надеюсь помог.