A linha cpu = 1+ rand() % 3;
está certa. Vai gerar um número entre 1 e 3 sempre (incluindo os extremos).
O problema está no trecho abaixo
if ((jogador == 1 && cpu == 3 || jogador == 2 && cpu == 1 || jogador == 3 && cpu == 2))
{
printf("Você Venceu. Parabéns!\n\n");
}
if (jogador == cpu) // verifica se houve empate
{
printf("Você empatou com o computador.\n\n");
}
else
{
printf("O computador venceu. Tenha mais sorte da próxima vez!\n\n");
}
Caso o jogador tenha vencido ele vai entrar no primeiro "if", mas do jeito que está após o corpo desse if ele vai testar o segundo if.
Claro que, se ele entrou no primeiro if, não tem como a condição do segundo if (jogador == cpu) ser verdadeira e ele então ele SEMPRE vai entrar no "else" do segundo if se o jogador vencer. Dessa forma, sempre que o jogador vencer após imprimir que o jogador venceu ele também vai imprimir que o computador venceu.
Para resolver, coloque um else após o primeiro if para que os testes que vem depois só sejam executados se ele não entrar no primeiro if. O trecho ficaria como abaixo.
if ((jogador == 1 && cpu == 3 || jogador == 2 && cpu == 1 || jogador == 3 && cpu == 2))
{
printf("Você Venceu. Parabéns!\n\n");
}
else
{
if (jogador == cpu) // verifica se houve empate
{
printf("Você empatou com o computador.\n\n");
}
else
{
printf("O computador venceu. Tenha mais sorte da próxima vez!\n\n");
}
}