This document discusses randomness and random number generation. It notes that cryptography relies on random numbers, but that generating truly random numbers is difficult. While theory assumes a perfect random source, in practice pseudorandom number generators are used. Several examples are given of systems that used weak random number generation that led to security issues. Lessons discussed include the importance of unpredictable seeds for pseudorandom number generators and using cryptographically secure functions. The document contrasts truly random and pseudorandom number generation, and provides tips for analyzing randomness in programs and web applications.