всегда вернётся, если val = 1:
if (val >= 1) return mStop;
А вот то, насколько часто бывает val = 1, это уже проблема вызывающей стороны.
Нет. Пусть mStart = 0, mStop = 3, mNum = 4. Для равновероятного val от 0 ло 1 должны равновероятно выпадать кадры от 0 до 3 включительно, все равно что rand() % mNum. То что выбирааются лишь некоторые (а не все) кадры в заданном диапазоне - не должно менять задачу, последний кадр должен быть столь же вероятен как любой другой.
Но в любом случае приятно видеть опыт постановки и практической работы с юзером