Given a restriction of "all areas are at are at least 3-4 blocks wide" the first idea that leaps to my mind is something like the following:
- pick one of 3x3, 3x4, 4x44x3 or 4x4
- place a block of that size in the center of the grid
- pick a direction (up, left, right, down)
- try to place a 3x3 block alongside previously placed blocks in that direction
- if successful, with some probability, try to expand the block to a 4x3 block in one of the directions you didn't just pick
- with some probability, move a to random edge of the filled in blocks
- repeat steps 3 to 6 until the area is large enough
The basic idea is, given you want all areas to have at least a given size, only work in areas that are that size. More generally, if you want something to be true of all generated outputs, see if it can be made true of all partially generated outputs.