Question Comment générer un nombre entier aléatoire en C #?


Comment générer un entier aléatoire en C #?


1427
2018-04-24 23:09


origine


Réponses:


le Random classe est utilisé pour créer des nombres aléatoires. (Pseudo-aléatoire c'est bien sûr.).

Exemple:

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

Si vous voulez créer plus d'un nombre aléatoire, vous devriez garder le Random instance et réutilisez-le. Si vous créez de nouvelles instances trop proches dans le temps, elles produiront la même série de nombres aléatoires que le générateur aléatoire est ensemencé à partir de l'horloge système.


1889
2018-04-24 23:19



Chaque fois que vous faites un nouveau Random (), il est initialisé. Cela signifie que dans une boucle serrée vous obtenez la même valeur beaucoup de fois. Vous devriez garder une seule instance aléatoire et continuer à utiliser Next sur la même instance.

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}

181
2017-10-04 11:52



La question semble très simple mais la réponse est un peu compliquée. Si vous voyez presque tout le monde a suggéré d'utiliser la classe Random et certains ont suggéré d'utiliser la classe RNG crypto. Mais alors quand choisir quoi.

Pour cela, nous devons d'abord comprendre le terme RANDOMNESS et la philosophie qui le sous-tend.

Je vous encourage à regarder cette vidéo qui va en profondeur dans la philosophie de RANDOMNESS en utilisant C # https://www.youtube.com/watch?v=tCYxc-2-3fY 

Première chose laissez-nous comprendre la philosophie de RANDOMNESS. Quand on dit à une personne de choisir entre ROUGE, VERT et JAUNE ce qui se passe en interne. Qu'est-ce qui fait qu'une personne choisit ROUGE ou JAUNE ou VERT?

c# Random

Une première pensée va dans l'esprit des personnes qui décide de son choix, il peut être la couleur préférée, la couleur chanceuse et ainsi de suite. En d'autres termes, un déclencheur initial que nous appelons SEED dans RANDOM. Ce SEED est le point de départ, le déclencheur qui l'incite à sélectionner la valeur RANDOM.

Maintenant, si un SEED est facile à deviner, alors ces types de nombres aléatoires sont appelés PSEUDO et quand une graine est difficile à deviner ces nombres aléatoires sont appelés SÉCURISÉ nombres aléatoires.

Par exemple, une personne choisit la couleur en fonction de la météo et de la combinaison sonore, alors il serait difficile de deviner la graine initiale.

c# Random

Maintenant laissez-moi faire une déclaration importante: -

* La classe "Random" génère uniquement un nombre aléatoire PSEUDO et pour générer un nombre aléatoire SECURE, nous devons utiliser la classe "RNGCryptoServiceProvider".

c# Random

La classe aléatoire prend des valeurs de départ de votre horloge CPU qui est très prévisible. Donc, en d'autres termes, la classe RANDOM de C # génère des nombres pseudo-aléatoires, ci-dessous est le code pour le même.

Random rnd= new Random();
int rndnumber = rnd.Next()

Alors que la classe RNGCryptoServiceProvider utilise l'entropie du système d'exploitation pour générer des graines. OS entropie est une valeur aléatoire qui est générée en utilisant le son, le clic de la souris et les timings du clavier, la température thermique, etc. Ci-dessous le code pour le même.

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
  byte[] rno = new byte[5];    
  rg.GetBytes(rno);    
  int randomvalue = BitConverter.ToInt32(rno, 0); 
}

Pour comprendre l'entropie de l'OS voir cette vidéo https://www.youtube.com/watch?v=tCYxc-2-3fY   à partir de 11h20 où la logique de l'entropie OS est expliquée. Donc, en mettant des mots simples, RNG Crypto génère des nombres aléatoires SECURE.


151
2018-06-14 06:27



Méfiez-vous que new Random() est ensemencé à l'horodatage actuel.

Si vous voulez générer juste un nombrevous pouvez utiliser:

new Random().Next( int.MinValue, int.MaxValue )

Pour plus d'informations, regardez le au hasard classe, mais s'il vous plaît noter:

Cependant, comme l'horloge a une résolution finie, l'utilisation du constructeur sans paramètre pour créer différents objets aléatoires en succession rapprochée crée des générateurs de nombres aléatoires qui produisent des séquences identiques de nombres aléatoires.

N'utilisez donc pas ce code pour générer une série de nombres aléatoires.


72
2018-04-24 23:10



Random r = new Random();
int n = r.Next();

42
2018-04-24 23:10



Je voulais ajouter une version cryptographiquement sécurisée:

Classe RNGCryptoServiceProvider (MSDN ou dotnetperls)

Il implémente IDisposable.

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}

22
2017-12-18 21:02



il est préférable de semer l'objet aléatoire avec les millisecondes actuelles, pour assurer un nombre aléatoire réel, et vous ne trouverez presque jamais de doublons en l'utilisant plusieurs fois

Random rand = new Random(DateTime.Now.Millisecond);

13
2017-11-01 12:30



Vous pouvez utiliser Jon Skeet StaticRandom méthode dans la bibliothèque de classes MiscUtil qu'il a construit pour un nombre pseudo-aléatoire.

using System;
using MiscUtil;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(StaticRandom.Next());
        }
    }
}

12
2018-04-24 23:31



J'ai essayé toutes ces solutions à l'exclusion de la réponse COBOL ... lol

Aucune de ces solutions n'était assez bonne. J'avais besoin de randoms dans un rapide pour int boucle et je recevais des tonnes de valeurs en double, même dans de très larges gammes. Après s'être fixé trop longtemps pour des résultats aléatoires, j'ai finalement décidé de résoudre ce problème une fois pour toutes.

Tout tourne autour de la graine.

Je crée un entier aléatoire en analysant les non-chiffres de Guid, puis je l'utilise pour instancier ma classe Random.

public int GenerateRandom(int min, int max)
{
    var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
    return new Random(seed).Next(min, max);
}

Mettre à jour: L'amorçage n'est pas nécessaire si vous instanciez une fois la classe Random. Il serait donc préférable de créer une classe statique et d'appeler une méthode.

public static class IntUtil
{
   private static Random random;

   private static void Init()
   {
      if (random == null) random = new Random();
   }

   public static int Random(int min, int max)
   {
      Init();
      return random.Next(min, max);
   }
}

Ensuite, vous pouvez utiliser la classe statique comme si ..

for(var i = 0; i < 1000; i++)
{
   int randomNumber = IntUtil.Random(1,100);
   Console.WriteLine(randomNumber); 
}

J'avoue que j'aime mieux cette approche.


10
2018-05-19 21:19