Olá Gabriel,
Em relação à variável que recebe false, você declara ela como uma variável booleana, isso significa que só existem 2 valores possíveis para ela: 0 e 1, ou true e false, ou 0V e 3,3V (em eletrônica) ou nível alto e nível baixo (portas lógicas), sempre nesses pares. O false torna a lógica mais fácil de entender nesse caso em específico, é como se você estivesse afirmando "Encontrei um número repetido!" e logo depois confirmando sua própria afirmação "não isso que eu disse é falso". Certo se voltarmos ao seu código, você verá que você declarou como falso antes de procurar na sua lista se realmente há número repetido, o que está certo pois afinal não foi encontrado ainda, seguindo o programa você vai fazer a verificação da lista, caso encontre um número repetido então você diz "Encontrei um número repetido!" e dessa vez é verdade, então você tem que confirmar "é verdade (achou = true)", o que eu faço agora com isso? não coloco na lista e sorteio outro número!
Em relação ao = e ao == é bem simples, e muito comum esta dúvida, nas linguagens de programação em geral, você tem que ter uma maneira de diferenciar uma comparação de igualdade com uma definição de igualdade, é como se com = você estivesse dizendo ao código "Isso é igual a isso !" e com == "Isso é igual a isso?". Nota a diferença entre '!' e '?' nas frases? então primeiro você disse 'achou' é igual a 'false' (achou = false) e disse que caso o número seja repetido o programa tem que mudar para 'achou' é igual a 'true' (achou = true), mas depois você pergunta afinal "achou é igual a false?" (achou == false) e seu código vai responder se sim ou não e executar aquilo que você pediu no if para sim e no else para não.
Espero ter ajudado!