Produza um número aleatório em um intervalo usando C #

267

Como faço para produzir números aleatórios dentro de um intervalo?

RoR
fonte

Respostas:

419

Podes tentar

Random r = new Random();
int rInt = r.Next(0, 100); //for ints
int range = 100;
double rDouble = r.NextDouble()* range; //for doubles

Dê uma olhada em

Classe aleatória , método Random.Next (Int32, Int32) e método Random.NextDouble

Adriaan Stander
fonte
30
Apenas para adicionar uma observação, se você estiver usando NextDouble () e não quiser que o limite inferior seja zero. Você multiplica pela diferença entre o limite superior e o limite inferior e adiciona a diferença entre o limite inferior e o zero. Então, para -1 a 1 double rDouble = (r.NextDouble()*2)-1.0;
Tom Heard
2
Ou um gerador duplo simplificado no intervalo de -1.0 e 1.0: Double randDoubleY = new Random (). Next (-100, 100) / 100.0D;
BoiseBaked
1
Random()usa uma semente dependente do tempo, mas escrever isso explicitamente é melhor para facilitar a leitura.
Evgeni Sergeev
44

Experimente o código abaixo.

Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51
Vishal Kiri
fonte
34

Algo como:

var rnd = new Random(DateTime.Now.Millisecond);
int ticks = rnd.Next(0, 3000);
ozczecho
fonte
2
para o que é DateTime.Now.Millisecond?
Hille
1
Você precisa colocar algo para começar com ...... o objeto Random simplesmente faz muita matemática no valor que você atribui e de uma maneira que cada chamada de Next () no mesmo objeto Random resultará em um valor bastante aleatório para a chamada anterior. Para tornar o resultado mais aleatório entre diferentes objetos aleatórios , você começa com um número diferente - aqui, o DateTime.Now.Millisecond. Se você colocar um valor constante, e não um valor alterado, obterá os mesmos resultados em .Next ().
Mike M
12
Randomjá foi propagado com um valor do sistema e Millisecondé apenas um número entre 0 e 999. Se esse par de linhas estivesse sempre junto no código, haveria apenas 1000 valores possíveis rnd.Nextdevido à redefinição da propagação a cada vez. A mesma semente entra, o mesmo número aleatório sai. Eu deixaria a semente manual de fora.
John McDonald
@JohnMcDonald, você está correto. Apenas para ser preciso, é inicializado com Environment.TickCount.
Parag Meshram 18/04
11

Usar:

Random r = new Random();
 int x= r.Next(10);//Max range
Kay
fonte
2
Isso não especifica um intervalo.
Winger Sendon
1
Você apenas faz lower_value + r. Next (10) para obter um intervalo aleatório.
Austin Salgat 3/11
6

Para futuros leitores, se você quiser um número aleatório em um intervalo, use o seguinte código:

public double GetRandomNumberInRange(double minNumber, double maxNumber)
{
    return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
}

C # Aleatório duplo entre min e max

Amostra de código

Darrelk
fonte
2
A fórmula deve ser da seguinte maneira:return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
Frank Sebastià
3

Aqui está a versão atualizada da resposta Darrelk . É implementado usando métodos de extensão C # . Ele não aloca memória ( new Random () ) toda vez que esse método é chamado.

public static class RandomExtensionMethods
{
    public static double NextDoubleRange(this System.Random random, double minNumber, double maxNumber)
    {
        return random.NextDouble() * (maxNumber - minNumber) + minNumber;
    }
}

Uso (certifique-se de importar o espaço para nome que contém a classe RandomExtensionMethods):

var random = new System.Random();
double rx = random.NextDoubleRange(0.0, 1.0);
double ry = random.NextDoubleRange(0.0f, 1.0f);
double vx = random.NextDoubleRange(-0.005f, 0.005f);
double vy = random.NextDoubleRange(-0.005f, 0.005f);
Konstantin Gindemit
fonte