Random numbers are important to a variety of cryptographic
protocols, such as randomly-generated keys and seeds. A problem one
runs up against when seeking random numbers is that it's
impossible to generate true random numbers from
deterministic algorithms. Instead, what algorithms produce are
"pseudo-random numbers" -- such algorithms are called
"pseudo-random generators" (PRGs).
The difference between pseudo-random numbers and genuine random
numbers is a basic fact of information theory. A genuine random
number contains as much entropy or information as
its bit length. Any algorithm that can be written in a computer
language cannot contain more entropy than is contained in its actual
source code (including any contained in language libraries and the
like). So there is a limit to the number and length of random
numbers that can be generated by a given algorithm. After a
while, patterns start occurring in pseudo-random streams. By
gathering some real-world random seed information (for example, the
microsecond timing of a user typing a phrase, or a bit of
information about external changes in the Internet), the entropy of
a PRG can be improved, but only by the amount of the entropy content
of the real-world seed data.