Oui.
Random.NextDouble renvoie un double entre 0 et 1. Vous multipliez ensuite cela par la plage dans laquelle vous devez entrer (différence entre le maximum et le minimum), puis ajoutez cela à la base (minimum).
public double GetRandomNumber(double minimum, double maximum)
{
Random random = new Random();
return random.NextDouble() * (maximum - minimum) + minimum;
}
Le code réel doit avoir random être un membre statique. Cela économisera le coût de création du générateur de nombres aléatoires et vous permettra d'appeler GetRandomNumber très fréquemment. Puisque nous initialisons un nouveau RNG à chaque appel, si vous appelez assez rapidement pour que l'heure système ne change pas entre les appels, le RNG sera amorcé avec exactement le même horodatage et générera le même flux de nombres aléatoires.
public double GetRandomNumber(this Random random, double minimum, double maximum) {...}
Johnny5 a suggéré de créer une méthode d'extension. Voici un exemple de code plus complet montrant comment procéder:
Vous pouvez maintenant l'appeler comme s'il s'agissait d'une méthode sur la
Random
classe:Notez que vous ne devez pas créer beaucoup de nouveaux
Random
objets dans une boucle car cela rendra probable que vous obteniez la même valeur plusieurs fois de suite. Si vous avez besoin de beaucoup de nombres aléatoires, créez une instance deRandom
et réutilisez-la.la source
Attention: si vous générez l'
random
intérieur d'une boucle comme par exemplefor(int i = 0; i < 10; i++)
, ne mettez pas lanew Random()
déclaration à l'intérieur de la boucle.Depuis MSDN :
Donc, sur la base de ce fait, faites quelque chose comme:
En procédant de cette façon, vous avez la garantie d'obtenir différentes valeurs doubles.
la source
L'approche la plus simple générerait simplement un nombre aléatoire entre 0 et la différence des deux nombres. Ajoutez ensuite le plus petit des deux nombres au résultat.
la source
Vous pouvez utiliser un code comme celui-ci:
la source
Vous pouvez faire ceci:
la source
Je suis un peu en retard à la fête mais j'avais besoin de mettre en place une solution générale et il s'est avéré qu'aucune des solutions ne peut satisfaire mes besoins.
La solution acceptée est bonne pour les petites plages; cependant,
maximum - minimum
peut être l'infini pour les grandes plages. Donc une version corrigée peut être cette version:Cela génère des nombres aléatoires bien même entre
double.MinValue
etdouble.MaxValue
. Mais cela introduit un autre "problème", qui est bien présenté dans cet article : si nous utilisons de si grandes plages, les valeurs peuvent sembler trop "artificielles". Par exemple, après avoir généré 10000 doubles aléatoires entre 0 etdouble.MaxValue
toutes les valeurs étaient comprises entre 2,9579E + 304 et 1,7976E + 308.J'ai donc créé une autre version, qui génère des nombres sur une échelle logarithmique:
Quelques tests:
Voici les résultats triés de la génération de 10 000 nombres doubles aléatoires entre 0 et
Double.MaxValue
avec les deux stratégies. Les résultats sont affichés avec une échelle logarithmique:Bien que les valeurs aléatoires linéaires semblent erronées à première vue, les statistiques montrent qu'aucune d'elles n'est "meilleure" que l'autre: même la stratégie linéaire a une distribution égale et la différence moyenne entre les valeurs est à peu près la même avec les deux stratégies .
Jouer avec différentes plages m'a montré que la stratégie linéaire devient "saine" avec une plage comprise entre 0 et
ushort.MaxValue
une valeur minimum "raisonnable" de 10,78294704 (pour uneulong
plage, la valeur minimum était 3,03518E + 15int
;: 353341). Ce sont les mêmes résultats des deux stratégies affichées avec des échelles différentes:Éditer:
Récemment, j'ai rendu mes bibliothèques open source, n'hésitez pas à voir la
RandomExtensions.NextDouble
méthode avec la validation complète.la source
Que faire si l'une des valeurs est négative? Ne serait pas une meilleure idée:
la source
Math.Abs()
c'est redondant. Puisque vous vous êtes assuré quemin >= max
, alorsmax - min
doit être un nombre non négatif de toute façon.Si vous avez besoin d'un nombre aléatoire dans la plage [
double.MinValue
;double.MaxValue
]Utilisez à la place:
la source
À propos de la génération du même nombre aléatoire si vous l'appelez dans une boucle, une solution astucieuse consiste à déclarer le nouvel objet Random () en dehors de la boucle en tant que variable globale.
Notez que vous devez déclarer votre instance de la classe Random en dehors de la fonction GetRandomInt si vous allez l'exécuter dans une boucle.
"Pourquoi est-ce?" tu demandes.
Eh bien, la classe Random génère en fait des nombres pseudo aléatoires, la «graine» du randomiseur étant l'heure système. Si votre boucle est suffisamment rapide, l'heure de l'horloge système n'apparaîtra pas différente de celle du randomiseur et chaque nouvelle instance de la classe Random commencerait avec la même graine et vous donnerait le même nombre pseudo aléatoire.
La source est ici: http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/
la source
Utilisez un aléatoire statique ou les nombres ont tendance à se répéter dans des boucles serrées / rapides en raison de l'horloge système les ensemencant.
Voir aussi: https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.8
la source
la source