Eu preciso de uma função que gere um número inteiro aleatório em determinado intervalo (incluindo valores de borda). Não tenho requisitos de qualidade / aleatoriedade irracionais, tenho quatro requisitos:
- Eu preciso que seja rápido. Meu projeto precisa gerar milhões (ou às vezes dezenas de milhões) de números aleatórios e minha função atual de gerador provou ser um gargalo.
- Eu preciso que ele seja razoavelmente uniforme (o uso de rand () é perfeitamente adequado).
- os intervalos min-max podem ser de <0, 1> a <-32727, 32727>.
- tem que ser semeada.
Atualmente, tenho o seguinte código C ++:
output = min + (rand() * (int)(max - min) / RAND_MAX)
O problema é que ele não é realmente uniforme - max é retornado apenas quando rand () = RAND_MAX (para Visual C ++ é 1/32727). Esse é um problema importante para pequenos intervalos como <-1, 1>, onde o último valor quase nunca é retornado.
Peguei caneta e papel e criei a seguinte fórmula (que se baseia no truque de arredondamento inteiro (int) (n + 0,5)):
Mas ainda não me dá uma distribuição uniforme. Execuções repetidas com 10000 amostras fornecem uma proporção de 37:50:13 para valores de valores -1, 0. 1.
Você poderia sugerir uma fórmula melhor? (ou até mesmo a função gerador de números pseudo-aleatórios)