Here's revised draft tables to schedule two lessons per day.
Number of days of each lesson is fixed to be 5 for brevity. In brief, it chooses random 20 days out of 30 and then assign each lesson to one of the available slots in 20 days.
As you will notice, this may fail to assign some of lesson 8 in which case you need to retry by recalculating tables.

SCHED (excerpt)
A1 Lessons
A2 1
A3 2
B1 Number of days
B2 5
B3 5
C1 actual results
C2 =COUNTIF(H$2:I$31,A2)
C3 =COUNTIF(H$2:I$31,A3)
D1 Days excluded 1st
D2 5
D3 1
E1 Days excluded 2nd
E2 10
E3 3
F1 Days excluded 3rd
F2
F3
G1 Days of month
G2 1
G3 2
H1 Lessons per day 1st
H2 =IFERROR(INDEX(LUT::A,MATCH($G2*2-1,LUT::$D,0)),"")
H3 =IFERROR(INDEX(LUT::A,MATCH($G3*2-1,LUT::$D,0)),"")
I1 Lessons per day 2nd
I2 =IFERROR(INDEX(LUT::A,MATCH($G2*2,LUT::$D,0)),"")
I3 =IFERROR(INDEX(LUT::A,MATCH($G3*2,LUT::$D,0)),"")
J1 TRUE
J2
J3
LUT (excerpt)
A1 lesson
A2 1
A3 1
A4 1
A5 1
A6 1
B1 k
B2 =IF(LARGE(CHOOSE(A2,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E2)<0,0,
MATCH(LARGE(CHOOSE(A2,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E2),
CHOOSE(A2,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),0))
B3 =IF(LARGE(CHOOSE(A3,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E3)<0,0,
MATCH(LARGE(CHOOSE(A3,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E3),
CHOOSE(A3,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),0))
B4 =IF(LARGE(CHOOSE(A4,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E4)<0,0,
MATCH(LARGE(CHOOSE(A4,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E4),
CHOOSE(A4,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),0))
B5 =IF(LARGE(CHOOSE(A5,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E5)<0,0,
MATCH(LARGE(CHOOSE(A5,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E5),
CHOOSE(A5,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),0))
B6 =IF(LARGE(CHOOSE(A6,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E6)<0,0,
MATCH(LARGE(CHOOSE(A6,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),E6),
CHOOSE(A6,RAND::D,RAND::E,RAND::F,RAND::G,RAND::H,RAND::I,RAND::J,RAND::K),0))
C1 days
C2 =IF(B2=0,"",INDEX(RAND::C,B2))
C3 =IF(B3=0,"",INDEX(RAND::C,B3))
C4 =IF(B4=0,"",INDEX(RAND::C,B4))
C5 =IF(B5=0,"",INDEX(RAND::C,B5))
C6 =IF(B6=0,"",INDEX(RAND::C,B6))
D1 index
D2 =C2*2-2+COUNTIF(C$2:C2,C2)
D3 =C3*2-2+COUNTIF(C$2:C3,C3)
D4 =C4*2-2+COUNTIF(C$2:C4,C4)
D5 =C5*2-2+COUNTIF(C$2:C5,C5)
D6 =C6*2-2+COUNTIF(C$2:C6,C6)
E1
E2 1
E3 2
E4 3
E5 4
E6 5
RAND (excerpt)
A1 1
A2 2
A3 3
B1 =RAND()
B2 =RAND()
B3 =RAND()
C1 =IF(LARGE(B,A1)<0,0,MATCH(LARGE(B,A1),B,0))
C2 =IF(LARGE(B,A2)<0,0,MATCH(LARGE(B,A2),B,0))
C3 =IF(LARGE(B,A3)<0,0,MATCH(LARGE(B,A3),B,0))
D1 =IF(COUNTIF(SCHED::$D$2:$F$2,$C1)>0,-1,RAND())
D2 =IF(COUNTIF(SCHED::$D$2:$F$2,$C2)>0,-1,RAND())
D3 =IF(COUNTIF(SCHED::$D$2:$F$2,$C3)>0,-1,RAND())
E1 =IF(OR(COUNTIF(SCHED::$D$3:$F$3,$C1)>0,COUNTIF(LUT::$B$2:$B$6,$A1)>1),-1,RAND())
E2 =IF(OR(COUNTIF(SCHED::$D$3:$F$3,$C2)>0,COUNTIF(LUT::$B$2:$B$6,$A2)>1),-1,RAND())
E3 =IF(OR(COUNTIF(SCHED::$D$3:$F$3,$C3)>0,COUNTIF(LUT::$B$2:$B$6,$A3)>1),-1,RAND())
F1 =IF(OR(COUNTIF(SCHED::$D$4:$F$4,$C1)>0,COUNTIF(LUT::$B$2:$B$11,$A1)>1),-1,RAND())
F2 =IF(OR(COUNTIF(SCHED::$D$4:$F$4,$C2)>0,COUNTIF(LUT::$B$2:$B$11,$A2)>1),-1,RAND())
F3 =IF(OR(COUNTIF(SCHED::$D$4:$F$4,$C3)>0,COUNTIF(LUT::$B$2:$B$11,$A3)>1),-1,RAND())
G1 =IF(OR(COUNTIF(SCHED::$D$5:$F$5,$C1)>0,COUNTIF(LUT::$B$2:$B$16,$A1)>1),-1,RAND())
G2 =IF(OR(COUNTIF(SCHED::$D$5:$F$5,$C2)>0,COUNTIF(LUT::$B$2:$B$16,$A2)>1),-1,RAND())
G3 =IF(OR(COUNTIF(SCHED::$D$5:$F$5,$C3)>0,COUNTIF(LUT::$B$2:$B$16,$A3)>1),-1,RAND())
H1 =IF(OR(COUNTIF(SCHED::$D$6:$F$6,$C1)>0,COUNTIF(LUT::$B$2:$B$21,$A1)>1),-1,RAND())
H2 =IF(OR(COUNTIF(SCHED::$D$6:$F$6,$C2)>0,COUNTIF(LUT::$B$2:$B$21,$A2)>1),-1,RAND())
H3 =IF(OR(COUNTIF(SCHED::$D$6:$F$6,$C3)>0,COUNTIF(LUT::$B$2:$B$21,$A3)>1),-1,RAND())
I1 =IF(OR(COUNTIF(SCHED::$D$7:$F$7,$C1)>0,COUNTIF(LUT::$B$2:$B$26,$A1)>1),-1,RAND())
I2 =IF(OR(COUNTIF(SCHED::$D$7:$F$7,$C2)>0,COUNTIF(LUT::$B$2:$B$26,$A2)>1),-1,RAND())
I3 =IF(OR(COUNTIF(SCHED::$D$7:$F$7,$C3)>0,COUNTIF(LUT::$B$2:$B$26,$A3)>1),-1,RAND())
J1 =IF(OR(COUNTIF(SCHED::$D$8:$F$8,$C1)>0,COUNTIF(LUT::$B$2:$B$31,$A1)>1),-1,RAND())
J2 =IF(OR(COUNTIF(SCHED::$D$8:$F$8,$C2)>0,COUNTIF(LUT::$B$2:$B$31,$A2)>1),-1,RAND())
J3 =IF(OR(COUNTIF(SCHED::$D$8:$F$8,$C3)>0,COUNTIF(LUT::$B$2:$B$31,$A3)>1),-1,RAND())
K1 =IF(OR(COUNTIF(SCHED::$D$9:$F$9,$C1)>0,COUNTIF(LUT::$B$2:$B$36,$A1)>1),-1,RAND())
K2 =IF(OR(COUNTIF(SCHED::$D$9:$F$9,$C2)>0,COUNTIF(LUT::$B$2:$B$36,$A2)>1),-1,RAND())
K3 =IF(OR(COUNTIF(SCHED::$D$9:$F$9,$C3)>0,COUNTIF(LUT::$B$2:$B$36,$A3)>1),-1,RAND())
Notes.
Formulae in SCHED::C2, SCHED::H2:I2 can be filled down.
Formulae in LUT::B2:D2 can be filled down.
LUT::A and LUT::E hold constant values as shown in screenshot.
Formula in RAND::B1 can be filled down across B1:B30.
Formulae in RAND::C1:K1 can be filled down across C1::K20.
RAND::D21:K30 hold constant value -1.
RAND::C21:C30 are blank.
Tables are built with Numbers v2.
Regards,
H