Today, I got into an argument about the term “procedural generation”.
My point was that its different from “classic” random generation in that procedural generation is based on a more mathematical, fractal-based, algorithm leading to a more “realistic” distribution and the usual randomness of most languages are based on a pseudo-random-number generator, leading to an “unrealistic”, in a way, ugly, distribution. This discussion was made with a heightmap in mind.
The discussion left me somehow unconvinced about my own arguments though, so, is there more to it? Or am I the one who is, in fact, simply wrong?
3
I think you’re wrong. Procedural is not the opposite of random; procedural is the opposite of handmade.
its different from “classic” random generation in the way that
procedural is based on a more mathematical, fractal based, algorithm
leading to a more “realistic” distribution and the usual randomness of
most languages are based on a pseudo-random-number generator, leading
to an “unrealistic”, in a way, ugly, distribution.
Both of the schemes you are describing here are procedural. The first is arguably better, more sophisticated, but both:
- take a small input (the seed);
- use that seed and nothing else, along with an algorithmic process, to produce the output
Now, it might well be that when people talk about procedural generation, what they usually talk about are complicated generation schemes based on carefully refined algorithms – but they are still random in the sense that the input is a random variate.
The “‘unrealistic’, in a way, ugly, distribution[s]” you mention? Those are procedural too – just using a relatively unsophisticated procedural generation scheme.
1
First off, everything a computer does is by definition pseudo-random, unless it is actually connected to a radioactivity counting device or something similar. It doesn’t matter whether you use fractal iterative systems, linear equations or whatever – the same seed will produce the same sequence (and that is often good, e.g. for creating rliable test suites).
Certainly there are good and bad algorithms for producing random sequences by computer, but the definition of what is “realistic” (much less “ugly”) is by no means uncontested. As a very basic example, you would naively expect a random series of binary digits to have equals amounts of 0 and 1 values, but actually this definition would make every other item completely predictable, and the resulting sequence very, very predictable.
Actual random sequences of binary digits tend to have roughly equal amounts of 0s and 1s, and the ratio tends to approach 0.5 as the sequence grows, but the absolute number of 0s and 1s is actually more likely to become more unequal over time. (Getting exactly 500,000 0s and 500,000 1s from a million random digits is quite improbable.) So you see that the definition of “random” is rather more complicated than just “unpredictable” or “evenly distributed”, and there is no complete consensus on what the definition should be or which properties of sequences are actually needed for a given task. I’m not certain which of those properties can be improved with fractal generators over the standard linear congruential generators, but I expect more knowledgeable people will post some.
Let me add to the discussion that the difference between ‘random’ and ‘deterministic’ is, in the real world, a pure matter of subjective perception. – Like you said: Some solutions produce “ugly” results while others don’t.
In the world I’m referring to, the actual difference between ‘random’ and non-random is basically only, if the human observer is able to recognize a pattern in the generated output, like some recurring scheme or some other aspect that makes him aware what the output might probably look like in one of the next iterations. The ability to recognize a given pattern depends of course heavily on the oberver’s context: Some people may fail to see the pattern behind the sequence 2, 3, 5, 7, 9, 11, 13, 17, 19, 23, 29
, while other’s are likely to quickly detect it.
Therefor, every cheap off-the-shelf PRNG will easily make the observer/user believe its output is really random. – Or, put in another way: Whenever the observer fails to recognize the cause-consequence (or input-output) correlation in a system his observations will appear as purely random to him.
As I see it, the question then becomes:
- How complex would the algorithm need to be to ‘deceive’ the (expected) observer?
and - How to shape the output in a way that, while remaining perceived basically random, creates the desired ‘realistic’ or ‘non-ugly’ perception. – This may also be about aesthetics. Fractal algorithms often are good at this, because their output structurally resembles the observer’s impression of the real world.
procedural generation means there is a seed which defines all output and no matter how many times you regenerate with the same seed you get the same output each time, which you see used for example in minecraft and dwarf fortress
true random generation takes extra external entropy to add to the initial seed so each time it runs you get a different output
it is important to note that both approaches can result in both good and bad generation
common psuedo random generators used for this are linear congruential generators and mercenne twisters, either of which can be sufficient if used correctly
for example minecraft uses a LCG (as in java’s stock standard Random implementation) for it’s map generation
The main difference between procedural generation and pseudo-random generation is that numbers generated by a procedural generation algorithm (such as a fractal) are supposed to have some preset relations whereas pseudo-random numbers are supposed to simulate truly random processes.
Note — this answer is based on Wikipedia’s definition of procedural generation