Should we cast `upper` and `lower` to ints or throw an error if they're floats? If they're floats I think you can run into situations where there's less than 1 total probability.