Вы предполагаете, что причина того, что ваш код не работает так, как вы этого хотите, заключается в том, что компилятор ошибочно применяет какое-то общее исключение подвыражений, что приводит к тому, что foo 0 50
оценивается только один раз.Это не вариант.Компилятор очень хорошо знает, что функции могут быть нечистыми и не будут выполнять оптимизации, которые порвались бы с нечистым кодом (если только не доказано, что конкретный код, который оптимизируется, является чистым).Так что вам не нужно беспокоиться о том, чтобы компилятор думал, что вы используете аргумент.
Проблема не в том, что foo 0 50
вызывается только один раз - он действительно вызывается 100 раз, как вы хотите,Проблема в том, что он возвращает одно и то же значение каждый из 100 раз, когда он вызывается.
Но зачем ему это делать, когда он возвращает разные значения при тестировании вручную?
Поскольку вы создаетеновый случайный объект каждый раз, когда вы звоните foo
.Поскольку вы не предоставляете начальное значение этому случайному объекту, оно будет заполнено текущим системным временем.Поэтому, если вы вызываете функцию несколько раз, а между ними проходит некоторое время, она каждый раз будет возвращать разные значения.Однако, если вы вызовете его 100 раз за такой короткий промежуток времени, что системное время между ними не изменится, вы получите одно и то же значение 100 раз.
Таким образом, решение вашей проблемы заключается в повторном использованииодин и тот же случайный объект вместо создания нового каждый раз, когда вызывается foo
.