168 votes

Nombre Aléatoire Entre 2 Double Numéros

Il est possible de générer un nombre aléatoire entre 2 doubles?

Exemple:

public double GetRandomeNumber(double minimum, double maximum)
{
    return Random.NextDouble(minimum, maximum) 
}

Puis-je appeler avec les éléments suivants:

double result = GetRandomNumber(1.23, 5.34);

Toute pensée serait appréciée.

Merci!

358voto

Michael Points 34110

Oui.

Aléatoire.NextDouble renvoie un double entre 0 et 1. Ensuite, vous multipliez-le par la plage, vous devez aller dans (différence entre le maximum et le minimum), puis l'ajouter à la base (minimum).

public double GetRandomNumber(double minimum, double maximum)
{ 
    Random random = new Random();
    return random.NextDouble() * (maximum - minimum) + minimum;
}

Code réel devrait avoir aléatoire être un membre statique. Cela permettra d'économiser le coût de la création du générateur de nombre aléatoire, et vous permettra d'appeler getrandomnumber n'très fréquemment. Puisque nous sommes à l'initialisation d'un nouveau générateur de nombres aléatoires à chaque appel, si vous appelez assez rapide que le système de temps ne change pas entre les appels de la RNG obtiendrez ensemencées avec exactement le même timestamp, et de générer le même flux de nombres aléatoires.

43voto

Mark Byers Points 318575

Johnny5 a suggéré la création d'une méthode d'extension. Voici un code plus complet d'un exemple montrant comment vous pourriez faire ceci:

public static class RandomExtensions
{
    public static double NextDouble(
        this Random random,
        double minValue,
        double maxValue)
    {
        return random.NextDouble() * (maxValue - minValue) + minValue;
    }
}

Maintenant, vous pouvez l'appeler comme si il s'agissait d'une méthode sur l' Random classe:

Random random = new Random();
double value = random.NextDouble(1.23, 5.34);

Notez que vous ne devez pas créer beaucoup de nouveaux Random objets dans une boucle, car cela rendrait-il probable que vous obtenez de la même valeur plusieurs fois dans une rangée. Si vous avez besoin de beaucoup de nombres aléatoires, puis créer une instance de l' Random et ré-utiliser.

8voto

Greg D Points 24218

L'approche la plus simple serait tout simplement de générer un nombre aléatoire entre 0 et la différence de deux nombres. Ajoutez ensuite le plus petit des deux nombres de la suite.

3voto

Malcolm Points 14261

Vous pouvez utiliser un code comme ceci:

public double getRandomNumber(double minimum, double maximum) {
    return minimum + randomizer.nextDouble() * (maximum - minimum);
}

1voto

Chris Susie Points 21

Que faire si une des valeurs est négatif? Ne serait pas une meilleure idée:

double NextDouble(double min, double max)
{
       if (min >= max)
            throw new ArgumentOutOfRangeException();    
       return random.NextDouble() * (Math.Abs(max-min)) + min;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X