Randomness is a powerful tool for solving various problems in all areas of computer applications. Randomized algorithms are often more efficient, simpler (and so easier to implement), and surprisingly also more reliable than their best deterministic counterparts. This book does not only systematically teach the paradigmic algorithm design methods, such as foiling an adversary, abundance of witnesses, fingerprinting, amplification, and random sampling, but it also provides a deep insight into the nature of the success of randomization. Taking sufficient space for presenting motivation and for developing reader's intuition. It is an ideal introduction to the subject.