Я думаю, что ваша математика здесь немного ...
В соответствии с имеющимся у вас кодом вы будете генерировать случайные числа в диапазоне от 1 до 1000.
Ваш чек (toSub == (SubsRate * 1000)) просто проверяет, является ли сгенерированное вами число 3 (с коэффициентом * 1000 = 3). Следовательно, вы получите только 3 раза, примерно 1000 раз, а не 3000 раз.
Вы не упомянули, каков диапазон ваших чисел, но, вообще говоря, если вы хотите сгенерировать число в диапазоне между IMIN и IMAX с использованием равномерного распределения (каждое значение имеет одинаковую вероятность появления), ты просто пишешь:
int I = IMin + rand() % (IMax - IMin);
В этом случае, если вы хотите, чтобы каждое число появлялось один раз каждые 3000 раз, вам придется рандомизировать число от 1 до 3000. В противном случае вы не говорите о равномерном распределении.