Ok people so I am new to using RunService so I tried it in my light script. The script is below.

--Script that makes light flicker and fade and whatever

--Services
local RunService = game:GetService("RunService")

--Variables for objects
local lightModel = script.Parent
local lightPart = lightModel.Light
local light = lightPart.SurfaceLight

--Ignore this just some notes.
--Variables for light configurations are not usable
--Found out that creating variables directly for a property, will get the number
--But not the property itself. Just takes number. So you must manually edit, as it is below

--Variables for a few amounts
local LOWEST_AMOUNT = 0.1
local HIGHEST_AMOUNT = 1
local minFades = 1
local maxFades = 5
local minFlickers = 1
local maxFlickers = 4
local backupAmount = 0.1 
local goingDown = true
local goingUp = false
local startNewFade = false

local function fadeOutAndFadeIn(initialAmount, lowestAmount, changeAmount)
    
	--Light is always VERY near wanted amount, but not exactly, so if you check if it is 0 all the time, it will not be, so it will not work.
	local brightness = 1
	local finishedFade = false
	
	RunService.Stepped:Connect(function()
		if goingDown == true then
			print(brightness - changeAmount)
			brightness = brightness - changeAmount
			print(brightness)
			light.Brightness = brightness
			print(light.Brightness)
			if brightness <= lowestAmount then
				goingDown = false
				goingUp = true
				brightness = lowestAmount
			end
		elseif goingUp == true then
			print(brightness + changeAmount)
			brightness = brightness + changeAmount
			print(brightness)
			light.Brightness = brightness
			print(light.Brightness)
			if brightness >= initialAmount then
				brightness = initialAmount
				goingUp = false
				finishedFade = true
			end
		elseif finishedFade == true then
			brightness = initialAmount
			finishedFade = false
			goingDown = true
			startNewFade = true
		end
	end)
end

local function flickerLight(topAmount, lowestAmount, gap)
	print("Started flicker")
	light.Brightness = topAmount
	wait(gap)
	light.Brightness = lowestAmount
	wait(gap)
	light.Brightness = topAmount
	return "Done"
end


while true do
	local howManyFades = math.random(minFades, maxFades)
	local howManyFlickers = math.random(minFlickers, maxFlickers)
	print(howManyFades, howManyFlickers)
	
	for count = 1, howManyFades do
		fadeOutAndFadeIn(HIGHEST_AMOUNT, LOWEST_AMOUNT, 0.01)
		print("Fadehappen")
		repeat
			wait()
		until startNewFade == true
		startNewFade = false
	end
	wait()
	for flickerCount = 1, howManyFlickers do
		local flickerFunction = flickerLight()
		repeat
			wait()
		until flickerFunction == "Done"
	end
end

So what is meant to happen is it smoothly flickers a random amount of times, and then it flickers, and then that happens forever. The fading is my first issue. At first, it fades in and out smoothly, as expected. However, as time goes on, the numbers seem to jump. It is not a problem with the brightness not working, but the numbers themselves.

print(brightness - changeAmount)
			brightness = brightness - changeAmount

They gradually start to change in larger amounts. For example, 0.53 turning into 0.42, and even worse, they jump up in the process of going down. At some point they start to act like the flicker, the light value changing in values not too far from 1 and it gets worse. The prints get fast and unsteady, the lag increases. Secondly, the flickers happen randomly in the process of fading too. Maybe I should have used a different RunService thing like Heartbeat which I haven't used and barely know the difference about. Don't blame me if there is a really stupid error I am not good at this stuff. But I would like to know why this happens. It might be because of things running at the same time or whatever but please help.

Note: I will try TweenService with this too, don't say, because I haven't used that before too.

Just ask if you need more information on the results of prints. Thanks in advance.

Ahh I was told to use TweenService so yeah. Maybe the RunService is not good for this... Oh well.