This reproduces the image decently. It works by sampling without replacement from all the positions, and randomly coloring them with a built-in color scheme.
size = 41;
amountCovered = 0.40;
noSquares = Floor[amountCovered*size^2];
tiles = Flatten[Table[{i, j}, {i, size}, {j, size}], 1];
probabilities = Flatten@GaussianMatrix[Floor[size/2]];
sample = RandomSample[probabilities -> tiles, noSquares];
colors = RandomInteger[21, noSquares];
mat = SparseArray[sample -> colors, {size, size}];
ArrayPlot[mat, Frame -> None,
ColorRules -> {0 -> RGBColor[{237, 233, 214}/255],
x_ -> ColorData[54][x]}]
![nice colorful squares]](http://i.stack.imgur.com/du5A2.png)
For black and white, just replace colors with 1, and remove the ColorRules rules:
mat = SparseArray[sample -> 1, {size, size}];
ArrayPlot[mat, Frame -> None]

Choice of colors
Choosing randomly from a set of colors instead of the built in ColorData:
lesCouleurs = {RGBColor[0.4, 0.4, 1], RGBColor[1, 0.5, 0.5], RGBColor[0, 0, 0]}
colors = RandomInteger[Length@lesCouleurs, noSquares];
mat = SparseArray[sample -> colors, {size, size}];
ArrayPlot[mat, Frame -> None,
ColorRules -> {0 -> RGBColor[{237, 233, 214}/255],
x_ :> lesCouleurs[[x]]}]
N.B. I was lazy in using GaussianMatrix for computing the probabilities, so only odd sizes work as expected.