In a proof-of-stake protocol there are usually two distinct categories of systems for determining the eligibility of a given validator to issue a block:
- Computed publicly by performing some computation that is repeatable by everyone else and thus verifiable (Peercoin falls into this category AFAIK)
- Using a cryptographic system that involves a private-key computation and a public-key verification (BABE falls into this category using VRFs)
The advantage of the latter system is that since the computation for eligibility is not public (i.e. only the owner of the private-key can do it), it is harder for adversaries to corrupt the protocol since they cannot predict whether a given validator will be eligible to author the next block or not.
Epochs are used to collect entropy from VRF outputs, this entropy is then used on a future epoch as a seed for the VRF (https://research.web3.foundation/en/latest/polkadot/block-production/Babe.html, https://polkadot.network/blog/polkadot-consensus-part-3-babe/). This is also the reason why a closed validator set is a requirement.