  Lambda calculus is the basis of functional programming and higher order proof
assistants. However, little is known about combinatorial properties of lambda
terms, in particular, about their asymptotic distribution and random
generation. This paper tries to answer questions like: How many terms of a
given size are there? What is a "typical" structure of a simply typable term?
Despite their ostensible simplicity, these questions still remain unanswered,
whereas solutions to such problems are essential for testing compilers and
optimizing programs whose expected efficiency depends on the size of terms. Our
approach toward the afore-mentioned problems may be later extended to any
language with bound variables, i.e., with scopes and declarations. This paper
presents two complementary approaches: one, theoretical, uses complex analysis
and generating functions, the other, experimental, is based on a generator of
lambda-terms. Thanks to de Bruijn indices, we provide three families of
formulas for the number of closed lambda terms of a given size and we give four
relations between these numbers which have interesting combinatorial
interpretations. As a by-product of the counting formulas, we design an
algorithm for generating lambda terms. Performed tests provide us with
experimental data, like the average depth of bound variables and the average
number of head lambdas. We also create random generators for various sorts of
terms. Thereafter, we conduct experiments that answer questions like: What is
the ratio of simply typable terms among all terms? (Very small!) How are simply
typable lambda terms distributed among all lambda terms? (A typable term almost
always starts with an abstraction.) In this paper, abstractions and
applications have size 1 and variables have size 0.
