Pregunta ¿Cómo puedo generar un número entero aleatorio en C #?


¿Cómo puedo generar un entero aleatorio en C #?


1427
2018-04-24 23:09


origen


Respuestas:


los Random clase se usa para crear números aleatorios. (Pseudoaleatorio eso es por supuesto).

Ejemplo:

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 va a crear más de un número al azar, debe conservar el Random instancia y reutilizarlo. Si crea instancias nuevas demasiado próximas en el tiempo, producirán la misma serie de números aleatorios a medida que el generador aleatorio se seleciona desde el reloj del sistema.


1889
2018-04-24 23:19



Cada vez que haces un nuevo Random () se inicializa. Esto significa que, en un ciclo cerrado, obtienes el mismo valor muchas veces. Deberías mantener una sola instancia Aleatoria y seguir usando Siguiente en la misma instancia.

//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 pregunta parece muy simple, pero la respuesta es un poco complicada. Si ve que casi todos han sugerido usar la clase Random y algunos han sugerido usar la clase de criptografía RNG. Pero luego cuando elegir qué.

Para eso necesitamos entender primero el término ALEATORIO y la filosofía detrás de él.

Te animo a que veas este video que profundiza en la filosofía de RANDOMNESS usando C # https://www.youtube.com/watch?v=tCYxc-2-3fY 

Primero, entendamos la filosofía de RANDOMNESS. Cuando le decimos a una persona que elija entre ROJO, VERDE y AMARILLO lo que sucede internamente. ¿Qué hace que una persona elija ROJO, AMARILLO o VERDE?

c# Random

Algunos pensamientos iniciales se dirigen a la mente de las personas que decide su elección, puede ser el color favorito, el color de la suerte, etc. En otras palabras, un disparador inicial que denominamos ALEATORIO como SEMILLA. Esta SEMILLA es el punto de inicio, el disparador que lo instiga a seleccionar el valor ALEATORIO.

Ahora bien, si un SEED es fácil de adivinar, ese tipo de números aleatorios se denominan como SEUDO y cuando una semilla es difícil de adivinar, esos números aleatorios se denominan ASEGURADO números al azar.

Por ejemplo, una persona elige el color dependiendo del clima y la combinación de sonido, entonces sería difícil adivinar la semilla inicial.

c# Random

Ahora déjame hacer una declaración importante:

* La clase "Aleatoria" genera solo el número aleatorio de PSEUDO y para generar un número aleatorio SEGURO necesitamos usar la clase "RNGCryptoServiceProvider".

c# Random

La clase aleatoria toma valores semilla de tu reloj de la CPU que es muy predecible. Entonces, en otras palabras, la clase RANDOM de C # genera números pseudoaleatorios, a continuación se muestra el código para la misma.

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

Mientras que la clase RNGCryptoServiceProvider usa la entropía del sistema operativo para generar semillas. La entropía del sistema operativo es un valor aleatorio que se genera mediante el sonido, el clic del mouse y el teclado, la temperatura térmica, etc. A continuación se muestra el código para el mismo.

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

Para comprender la entropía del sistema operativo, mira este video https://www.youtube.com/watch?v=tCYxc-2-3fY   a partir de las 11:20 donde se explica la lógica de la entropía del sistema operativo. Entonces, poniendo palabras simples, RNG Crypto genera números aleatorios SEGUROS.


151
2018-06-14 06:27



Cuidado con eso new Random() está sembrado en la marca de tiempo actual.

Si quieres generar solo un numeropuedes usar:

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

Para más información, mira el Aleatorio clase, aunque tenga en cuenta:

Sin embargo, como el reloj tiene una resolución finita, al usar el constructor sin parámetros para crear diferentes objetos aleatorios en estrecha sucesión se crean generadores de números aleatorios que producen secuencias idénticas de números aleatorios.

Entonces, no use este código para generar una serie de números aleatorios.


72
2018-04-24 23:10



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

42
2018-04-24 23:10



Quería agregar una versión criptográficamente segura:

RNGCryptoServiceProvider Class (MSDN o dotnetperls)

Implementa 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



es mejor sembrar el objeto Random con milisegundos actuales, para asegurar un verdadero número aleatorio, y casi no encontrará duplicados usándolo muchas veces

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

13
2017-11-01 12:30



Podría usar Jon Skeet's StaticRandom método dentro de la biblioteca de la clase MiscUtil que construyó para un número pseudoaleatorio.

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



He intentado todas estas soluciones excluyendo la respuesta COBOL ... jajaja

Ninguna de estas soluciones fue lo suficientemente buena. Necesitaba randoms en un ciclo rápido para int y estaba obteniendo toneladas de valores duplicados incluso en rangos muy amplios. Después de conformarme con los resultados aleatorios durante demasiado tiempo, decidí finalmente abordar este problema de una vez por todas.

Se trata de la semilla.

Creo un entero al azar analizando los no dígitos de Guid, luego lo uso para crear una instancia de mi clase Aleatoria.

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);
}

Actualizar: La creación de semillas no es necesaria si crea una instancia de la clase Random una vez. Así que sería mejor crear una clase estática y llamar a un método de eso.

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);
   }
}

Entonces puedes usar la clase estática como así ..

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

Admito que me gusta este enfoque mejor.


10
2018-05-19 21:19



Los números generados por el incorporado Random class (System.Random) genera números pseudoaleatorios.

Si quiere números aleatorios verdaderos, lo más cercano que podemos obtener es "generador pseudoaleatorio seguro" que se puede generar utilizando las clases criptográficas en C # como RNGCryptoServiceProvider.

Aún así, si todavía necesitas cierto los números aleatorios necesitarán usar una fuente externa, como los dispositivos que representan la desintegración radiactiva como una semilla para un generador de números aleatorios. Dado que, por definición, cualquier número generado por medios puramente algorítmicos no puede ser verdaderamente aleatorio.


6
2017-07-22 15:40