Simplistic Lava Lamp
Python 2, 117 113 108 107 106 105 bytes
from random import*
def f(n):a=['']*5;exec"i=randint(0,(n>44)+(n>59)<<1);a[i]=(a[i]or 0)+1;"*1000;print a
Try it online!
Returns a reversed list (bottom first)
Version inspired by the stackoverflow answer in the comments (edgecases are more likely):
Python 2, 129 bytes
from random import*
def f(n):a=sorted([1000]*5+sample(range(1001)*5,(n>44)+(n>59)<<1));print[y-x or''for x,y in zip([0]+a,a)[:5]]
Try it online!
JavaScript (ES6), 78 bytes
Returns a reversed array where empty levels are filled with a space.
t=>(a=[...' '],g=k=>k?g(k-1,a[Math.random()*(t>59?5:t<45||3)|0]++):a)(1e3)
Try it online!
Commented
t => ( // t = input
a = [...' '], // a[] = output array, initially filled with 5 spaces
g = k => // g = recursive function taking an iteration counter k
k ? // if k is not equal to zero:
g( // do a recursive call:
k - 1, // decrement k
a[ // update a[]:
Math.random() * ( // pick a random slot:
t > 59 ? 5 : // among all 5 slots if t > 59
t < 45 // force the 1st slot if t < 45
|| 3 // among the 3 first slots otherwise
) | 0 // round the above result to an integer
]++ // increment the wax amount on this slot
) // end of recursive call
: // else:
a // stop recursion and return a[]
)(1e3) // initial call to g() with k = 1000
R, 85 84 bytes
function(n)write(ifelse(t<-table(cut(runif(1e3,2*(n<60)+3*(n<45),5),0:5)),t,""),1,1)
-1 byte thanks to @Giuseppe
Try it online!
Explanation (ungolfed):
function(n){
# Generate 1000 random uniform numbers in [5,5] (if n<45),
# in [2,5] (if 45<=n<60) and in [0,5] (if n>=60).
x = runif(1e3,2*(n<60)+3*(n<45),5)
# Code each by the number of the interval it falls in (0,1],(1,2]...(4,5]
cx = cut(x,0:5)
# Tabulate the intervals. Because cut() returns a factor,
# zero counts are included
t = table(cx)
# Vector-wise replace zero elements with "" and cat out, 1 per line.
t1 = ifelse(t,t,"")
write(t1,1,1)
}