Randomized Algorithms: Approximation, Generation and Counting