Sim.
Random.NextDouble retorna um duplo entre 0 e 1. Você multiplica o valor pelo intervalo que você precisa (diferença entre o máximo e o mínimo) e depois o adiciona à base (mínimo).
public double GetRandomNumber(double minimum, double maximum)
{
Random random = new Random();
return random.NextDouble() * (maximum - minimum) + minimum;
}
O código real deve ter aleatoriamente um membro estático. Isso economizará o custo de criação do gerador de números aleatórios e permitirá que você chame GetRandomNumber com muita frequência. Como estamos inicializando um novo RNG a cada chamada, se você ligar rápido o suficiente para que o horário do sistema não mude entre as chamadas, o RNG será propagado com exatamente o mesmo registro de data e hora e gerará o mesmo fluxo de números aleatórios.
public double GetRandomNumber(this Random random, double minimum, double maximum) {...}
Johnny5 sugeriu a criação de um método de extensão. Aqui está um exemplo de código mais completo, mostrando como você pode fazer isso:
Agora você pode chamá-lo como se fosse um método na
Random
classe:Observe que você não deve criar muitos novos
Random
objetos em um loop porque isso tornará provável que você obtenha o mesmo valor várias vezes seguidas. Se você precisar de muitos números aleatórios, crie uma instânciaRandom
e reutilize-a.fonte
Cuidado: se você estiver gerando
random
um loop interno como, por exemplofor(int i = 0; i < 10; i++)
, não coloque anew Random()
declaração dentro do loop.Do MSDN :
Portanto, com base nesse fato, faça algo como:
Desta forma, você tem a garantia de obter valores duplos diferentes.
fonte
A abordagem mais simples simplesmente geraria um número aleatório entre 0 e a diferença dos dois números. Em seguida, adicione o menor dos dois números ao resultado.
fonte
Você pode usar código como este:
fonte
Você pode fazer isso:
fonte
Estou um pouco atrasado para a festa, mas eu precisava implementar uma solução geral e verificou-se que nenhuma das soluções pode satisfazer minhas necessidades.
A solução aceita é boa para pequenos intervalos; no entanto,
maximum - minimum
pode ser infinito para grandes intervalos. Portanto, uma versão corrigida pode ser esta versão:Isso gera números aleatórios bem entre
double.MinValue
edouble.MaxValue
. Mas isso introduz outro "problema", que é bem apresentado neste post : se usarmos intervalos tão grandes, os valores podem parecer "pouco naturais". Por exemplo, após gerar 10.000 dobras aleatórias entre 0 edouble.MaxValue
todos os valores estavam entre 2,9579E + 304 e 1,7976E + 308.Então, eu criei também outra versão, que gera números em uma escala logarítmica:
Alguns testes:
Aqui estão os resultados classificados da geração de 10.000 números duplos aleatórios entre 0 e
Double.MaxValue
com as duas estratégias. Os resultados são exibidos com o uso da escala logarítmica:Embora os valores aleatórios lineares pareçam estar errados à primeira vista, as estatísticas mostram que nenhum deles é "melhor" que o outro: mesmo a estratégia linear tem uma distribuição uniforme e a diferença média entre os valores é praticamente a mesma em ambas as estratégias .
Brincar com intervalos diferentes me mostrou que a estratégia linear fica "sã" com intervalo entre 0 e
ushort.MaxValue
com um valor mínimo "razoável" de 10,78294704 (para oulong
intervalo, o valor mínimo era 3,03518E + 15int
;: 353341). Estes são os mesmos resultados de ambas as estratégias exibidas em escalas diferentes:Editar:
Recentemente, criei minhas bibliotecas de código aberto, fique à vontade para ver o
RandomExtensions.NextDouble
método com a validação completa.fonte
E se um dos valores for negativo? Não seria uma idéia melhor:
fonte
Math.Abs()
é redundante. Como você garantiu issomin >= max
,max - min
deve ser um número não negativo de qualquer maneira.Se você precisar de um número aleatório no intervalo [
double.MinValue
;double.MaxValue
]Use em vez disso:
fonte
Sobre a geração do mesmo número aleatório, se você o chamar em um loop, uma solução bacana é declarar o novo objeto Random () fora do loop como uma variável global.
Observe que você deve declarar sua instância da classe Random fora da função GetRandomInt se você estiver executando isso em um loop.
"Por que é isso?" você pergunta.
Bem, a classe Random na verdade gera números pseudo-aleatórios, com a "semente" para o randomizador sendo a hora do sistema. Se o seu loop for suficientemente rápido, a hora do relógio do sistema não parecerá diferente do randomizador e cada nova instância da classe Random começará com a mesma semente e fornecerá o mesmo número pseudo-aleatório.
A fonte está aqui: http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/
fonte
Use um Random estático ou os números tendem a se repetir em loops apertados / rápidos devido ao relógio do sistema semeando-os.
Consulte também: https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.8
fonte
fonte