Вы можете либо сначала вычислить случайное значение, а затем ограничить его до желаемого диапазона [0, 255], либо вы можете сначала ограничить случайный диапазон.
Вычислить случайное значение, а затем зафиксировать
def clamp(value, minValue, maxValue):
"""Returns `value` clamped to the range [minValue, maxValue]."""
return max(minValue, min(value, maxValue))
clamp(np.random.randint(red - 10, red + 10))
Ограничить случайный диапазон
np.random.randint(max(0, red - 10), min(255, red + 10))
Обратите внимание, что распределение значений будет другим. В первой версии значение, изначально равное 5, можно было изменить на значение в диапазоне [-5, 15], которое будет обрезано до [0, 15]. Поскольку все значения в диапазоне [-5, 0] будут сопоставлены с 0, вероятность того, что новое значение будет равно 0, будет выше (6 из 21).
При втором подходе случайный диапазон сам настраивается. Значение, изначально равное 5, с равной вероятностью будет изменено на любое значение в диапазоне [0, 15].
Вам придется выбирать, исходя из того, что вы хотите.