You could try setting it up in the following way...
Have the user specify the number of rows and columns, and store those values in variables named rows and columns.
Loop: from 1 to ( rows * columns )
Push ascending integers (use the loop index) into an Array object.
Here we are basically creating a deck of cards, such that we'll have a card with a unique integer for each cell in the grid.
Loop: from 1 to columns:
Loop: from 1 to rows:
>> Create a text object at ( X = columns * desiredGridSize ) by ( Y = rows * desiredGridSize)
>> Set local variable RandomElementIndex to: ( floor( random( Array width ) ) )
>> Set text to: Get Array element ( RandomElementIndex )
>> Delete element ( RandomElementIndex )
Notice that each time we pick an element from the array, we also delete it right afterwards.
This is just like drawing a card at random from a deck of cards, and then discarding the card so it won't show up twice.