Tarefa
Dado um número inteiro positivo nmenor que o 2^30especificado como entrada da maneira que você escolher, seu código deve gerar um número inteiro aleatório entre 0e n, inclusive. O número que você gerar deve ser escolhido de maneira uniforme e aleatória . Cada valor de 0a ndeve ocorrer com a mesma probabilidade (consulte Regras e Advertências).
Regras e Advertências
Seu código pode assumir que qualquer gerador de números aleatórios incorporado à sua linguagem ou biblioteca padrão que afirma ser aleatoriamente uniforme é de fato uniforme. Ou seja, você não precisa se preocupar com a qualidade da fonte aleatória que está usando. Contudo,
- Você precisa estabelecer que, se a fonte aleatória que você está usando é uniforme, seu código gera corretamente um número inteiro aleatório uniforme de
0paran. - Qualquer argumento ao chamar uma função aleatória interna ou de biblioteca deve ser constante. Ou seja, eles devem ser completamente independentes do valor de entrada.
- Seu código pode terminar com probabilidade 1, em vez de ser garantido.
Notas
randInt(0,n)não é válido, pois leva a entrada como argumento para uma função interna ou de biblioteca.rand()%nvai não dar um número aleatório uniforme em geral. Como exemplo dado pela betseg, ifintmax == 15en = 10, então você terá muito mais chances de obter0-5que6-10.floor(randomfloat()*(n+1))também não fornecerá um número aleatório uniforme em geral devido ao número finito de diferentes valores possíveis de ponto flutuante entre 0 e 1.
rng()fornece0-100sen = 75, e função érng()%75, em seguida, 0-25 será mais comum ...)