Tarefa
Dado um número inteiro positivo n
menor que o 2^30
especificado como entrada da maneira que você escolher, seu código deve gerar um número inteiro aleatório entre 0
e n
, inclusive. O número que você gerar deve ser escolhido de maneira uniforme e aleatória . Cada valor de 0
a n
deve 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
0
paran
. - 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()%n
vai não dar um número aleatório uniforme em geral. Como exemplo dado pela betseg, ifintmax == 15
en = 10
, então você terá muito mais chances de obter0-5
que6-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
-100
sen = 75
, e função érng()%75
, em seguida, 0-25 será mais comum ...)