It is well-understood by now that allowing algorithms to make random choices improves our capabilities in essentially every area of computer science, discrete math, and in various application areas. We will develop the underlying theory and various powerful techniques, and see applications in areas including networking, machine learning, and optimization. A basic exposure to probability, and strong interest in algorithms and general mathematical reasoning, are the main prerequisites.