Итак для начала, хочу сказать, чтобы ты не задавал сразу два вопроса в одном вопросе (я понимаю, что каламбур, и именно поэтому так не делай).
Итак во-первых:
def get_regular_price():
price = float(input("Bвeдитe обычную цену товара: "))
return price
Существует такая штука, как пространство имён.
Вне функции переменной price не существует. И после исполнения (если ты не создашь эту переменную), то переменная price так же ниоткуда не появиться.
Внутри же функции, переменная price появиться на время исполнения этой функции. И после исполнения, она передаст значение (именно значение, а не название переменной) и тут же "исчезнет". Но до, того пока ты не вызвал функцию, переменная price вообще ни в каком виде не существует.
Можно использовать твою функцию и создать переменную с тем же названием в основном коде программы:
price = get_regular_price()
Но таким же способом можно и задать другое название переменной:
stoimost354 = get_regular_price()
По-второму вопросу, а именно про
import random
random.seed(10)
print(random.randint(1, 100))
Да, действительно, существует некая внутренняя реализация функции random. И случайность по умолчанию привязана к текущему времени. И да, действительно, можно указать число через инструкцию seed, которая вместо времени, будет за основу случайности брать, указанное тобой число. Но кроме "времени" или "числа" под капотом у функции есть ещё используемые в генерации параметры (если будет уместным назвать, то так называемая генерируемая "соль"). Посмотреть эти параметры можно если например в PyCharm сделать:
import random
и при помощи CTRL + Click на random, посмотреть исходник этой функции.