Short introduction, my background is more a programmer background than a math background, of course I have some general math experience and how to apply it within my work but for the sake of the question assume that's about it.
So as a little fun side project I've made an image generator (using PHP) that generates an image resembling green scrolling text that is shown in the movie: "The Matrix". I'm not sure this is the right place to ask but since my problem is more math than code related I thought I'd ask it here.
Here is an example of an image I've produced so far:
It works pretty good so far but the way I generate it now is troublesome for larger canvases. I'll try to give a short summary of what my current method is, I'll split the description in the same logic as I'm using in my code functions.
Description of current process
Based on the canvas size I determine 2 numbers, one for the amount of falling number rows (From here on out called "Strings") that are highly visible. And the other number for the amount of strings drawn in the background with a lower visibility.
Both numbers are then separately used to call a function to generate the collection of strings and their respective coordinates.
This function does this by randomly selecting some coordinates within the canvas and checking against the already generated Strings whether it is too close too any of them , if so it randomly selects a new pair of coordinates until some are found that are free.
Same goes for the strings in the background, although both groups are not checked against each other, so background strings can be below the more visible group of strings.
All of these strings are then drawn using a random length between a set range and random characters from a given set.
Problem
The problem as you might be able to guess at this point, is that this random pick and check method gets exponentially (If not more) slower, the bigger the canvas is.
I thought about doing it in blocks but then the edges between them might be noticeable.
Also i'd like for more variance in the font size, I currently only vary the background strings a bit, but to do that i'd have to change the margins based on font size (which is okay) but I'm thinking there has to be a better way than to actually randomly distribute it.
Question
Is there a better way to distribute my strings over the canvas that adheres to the following requirements?
- Is faster than randomly selecting and checking.
- Is between evenly distributed and random (Random but no big gaps)
- Prevents too much overlap, especially bright text on bright text.
If so, how? I'm sure there must be a way. I'll continue and try myself but I figure why not ask this community of smart people if they're willing to spare a few minutes of thought. :)
I would appreciate any help with this, even if it's just a few pointers in the right direction.

One thought for part of the problem, too long for a comment.
If placing the strings in blocks does speed things up I can two things to do to deal with block boundaries. The first is to do some experiments and see if the boundaries are really noticeable. If not, then you're done. If they are noticeable, consider having the blocks overlap some and choosing in each block with a distribution that gives lower probabilities near the edges. That might smooth out the block boundaries.
I suspect that there are solutions out there for processes that are "less random" than poisson (so fewer big gaps) but "more random" than uniform. Searching for spatial point process turns up lots of links some of which might be helpful.