The purpose of this research is twofold: to investigate the power of counting solutions to computational problems, and to determine the properties shared by the typical languages in a complexity class. Counting has been shown to be much harder than once thought, and deep connections have been drawn between the algebraic properties of counting classes and their computational difficulty. The goal is to resolve the structural relationships between counting classes and to show that, although each solution to a problem is easily verifiable, counting number of solutions is inherently difficult. Adapting the analytic notions of measure and category to complexity theory has yielded new techniques to study the internal structure of a complexity class. Various properties can be classified as either 'typical' or 'exceptional' for languages in the class, giving an overall qualitative picture of the class, and providing insight into the relative difficulties of computational problems. These new techniques, and their relation to pseudorandom sequences, will be investigated.*** //