Bom dia, boa tarde ou boa noite. Não importa o momento que você ler isso, mas compreenda o que de fato acontece no uso do Math.random().
Verifique no que diz a documentação do Math.random() no MDN: "O Math.random() método estático retorna um número pseudoaleatório de ponto flutuante, maior ou igual a 0 e menor que 1, com distribuição aproximadamente uniforme nesse intervalo"
Mais o que significa ser: maior ou igual a 0 e menor que 1?
Na matemática a representação para o intervalo: { x ∈ R ∣ 0 ≤ x < 1 } ou [0, 1), sendo bem representado na teoria dos conjuntos de forma a ser compreendido visualmente com perfeição.

Sendo assim, temos que desmistificar o seguinte:
- O que é
[?
O[indica que o número esta contido no intervalo, ou seja, o 0 faz parte do conjunto e consequentemente será gerado. - O que é o
)
O)indica que o número não faz parte do intervalo, ou seja, o 1 não será incluso nos valores gerado.
Sendo assim, é necessário no sorteio multiplicar o valor por 11, 101, 1001, pois o intervalo não incluirá o valor: 11, 101 ou 1001, e sim o valor logo abaixo: 10, 100, 1000.
Como feito no código da aula: Math.random() * 100 + 1, isso implica na remoção do 0, pois se Math.random() * 100 = 0, 0 + 1 = 1. Isso então sorteará um valor dentro do intervalo: (0, Math.random() * 100 + 1].
Para simplificar o entendimento, foi removido o valor 0 do conjunto e incluído o valor 100, sendo matematicamente descrito por: { x ∈ R ∣ 0 < x ≤ 1 }.