Acredito que da forma que foi implementada pelo professor, podem ser atribuídos cursos repetidos ao mesmo aluno. Por exemplo, o aluno X pode ser matriculado no curso de Lógica de programação mais de uma vez.
À vista disso, substitui o código abaixo:
for index, row in nomes.iterrows():
id = row.id_aluno
matriculas = row.matriculas
for i in range(matriculas):
mat = [id, np.random.choice(cursos.index, p = prob)]
todas_matriculas.append(mat)
Por esse:
for index, row in nomes.iterrows():
id = row.id_aluno
matriculas = row.matriculas
cont = 0
cursos_aluno = []
while cont < matriculas:
curso = np.random.choice(cursos.index, p=prob)
if(curso not in cursos_aluno):
todas_matriculas.append([id, curso])
cursos_aluno.append(curso)
cont += 1
Que verifica se o curso escolhido aleatoriamente já foi escolhido anteriormente.