¿Cómo genero un número int aleatorio?

¿Cómo genero un número entero aleatorio en C #?

preguntado el 24 de abril de 10 a las 20:04

30 Respuestas

La Random clase se utiliza para crear números aleatorios. (Por supuesto, pseudoaleatorio).

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 aleatorio, debe mantener el Random instancia y reutilizarlo. Si crea nuevas instancias demasiado cercanas en el tiempo, producirán la misma serie de números aleatorios que el generador aleatorio sembró a partir del reloj del sistema.

respondido 17 mar '19, 11:03

Solo una nota para los usuarios de Unity C #, debe especificar "System.Random ()" ya que Unity tiene un "UnityEngine.Random ()" que choca (tenga en cuenta que "UnityEngine.Random ()" no tiene la capacidad de generar números). Como la unidad no siempre importa el sistema de forma predeterminada, esto puede causar cierta confusión. - josehot200

Para reutilizarlo, puede declarar rnd as static y / o configúrelo solo una vez al inicializar el código. - Junior Mayhé

@JuniorM: Sí, puede hacer que sea estático para reutilizarlo, pero debe tener cuidado para no acceder a él desde varios subprocesos, ya que no es seguro para subprocesos (como es habitual para cualquier clase que no esté específicamente hecha para subprocesos ). - Guffa

Creo que sería útil agregar un descargo de responsabilidad de que esto no es criptográficamente seguro, ya que esta es una pregunta popular, en caso de que alguien intente ciegamente hacer criptografía con Random... - daniel garcia rubio

Excelente respuesta. Hay algunas buenas "mejoras" para Random por ahí para hacer que su aleatoriedad sea más robusta: ericlippert.com/2019/02/04/fixing-random-part-2 y codeblog.jonskeet.uk/2009/11/04/revisiting-randomness . - Jesse C. Rebanadora

La pregunta parece muy simple pero la respuesta es un poco complicada. Si ve, casi todos han sugerido usar la clase Random y algunos han sugerido usar la clase de cifrado RNG. Pero luego, cuándo elegir qué.

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

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

Primero entendamos la filosofía del ALEATORIO. 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 # Aleatorio

Un pensamiento inicial entra en la mente de la persona y decide su elección, puede ser el color favorito, el color de la suerte, etc. En otras palabras, algún disparador inicial que llamamos AL ALEATORIO como SEMILLA. Este SEED es el punto de inicio, el disparador que lo instiga a seleccionar el valor ALEATORIO.

Ahora bien, si una SEED es fácil de adivinar, entonces ese tipo de números aleatorios se denominan como NICKNAME y cuando una semilla es difícil de adivinar, esos números aleatorios se denominan ASEGURADOS 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 # Aleatorio

Ahora permítanme hacer una declaración importante:

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

c # Aleatorio

La clase aleatoria toma valores semilla de su reloj de CPU, lo cual 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 el mismo.

var random = new Random();
int randomnumber = random.Next()

Aunque se cree que RNGCryptoServiceProvider La clase 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 los tiempos del teclado, 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, vea este video de las 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY donde se explica la lógica de la entropía del sistema operativo. Entonces, poniendo en palabras simples, RNG Crypto genera números aleatorios SEGUROS.

Respondido el 21 de Septiembre de 20 a las 02:09

¿No debería ser su byte [5] solo [4] ya que ToInt32 analiza solo 4 bytes? - Bernhard

Siempre es útil saber dónde viven estas clases. System.Security.Cryptography - Elton

Se recomienda usar RandomNumberGenerator.Create() en lugar de llamar al constructor de RNGCryptoServiceProvider ya que no está disponible en todas las plataformas. - dzitkowskik

Solo quiero precisar que SecureRandom ES una generación pseudoaleatoria. - Númenor

Debido a la mayor aleatoriedad de la semilla, ¿está bien crear nuevos objetos RNGCryptoServiceProvider cada vez que necesito generar un número aleatorio, o es aún mejor crear un objeto RNGCryptoServiceProvider y reutilizarlo siempre que necesite generar un número aleatorio, como debe hacerse con la clase Random? - user2150989

Cada vez que haces new Random () se inicializa. Esto significa que en un bucle cerrado obtienes el mismo valor muchas veces. Debe mantener una sola instancia aleatoria y seguir usando Next 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);
    }
}

Respondido 12 Feb 18, 21:02

¿No es esto lo que dijo @Guffa en su respuesta hace 6 meses? "Si crea nuevas instancias demasiado cerca en el tiempo, producirán la misma serie de números aleatorios" - Chris

@ Chris- Eso es lo que dijiste. En esto he proporcionado la implementación de eso. Creo que es una buena forma de hacerlo. Funciona mejor. - Pankaj Mishra

Esta es una implementación que sincroniza el código para su uso desde subprocesos seval. Eso es bueno para una aplicación de subprocesos múltiples, pero una pérdida de tiempo para una aplicación de un solo subproceso. - Guffa

@SeanWorle: Primero, lo probé con el enfoque de Guffa. Luego traté de almacenar lo mismo Random objeto. En ambos casos obtuve el mismo número aleatorio. Con el acercamiento de Pankaj no sucedió. Quizás esto sea azar, pero lo dudo ahora. Estoy consultando el número aleatorio en el mismo segundo de diferentes hilos. - las pruebas

@testing: Estoy de acuerdo en que el método de Pankaj es el correcto para usar. Lo que estoy diciendo es que se puede simplificar a esto: // Función para obtener un número aleatorio private static readonly Random getrandom = new Random (); public static int GetRandomNumber (int min, int max) {lock (getrandom) {// sincronizar return getrandom.Next (min, max); }} - Sean Worle

Cuidado con eso new Random() se inserta en la marca de tiempo actual.

Si quieres generar solo un numero puedes usar:

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

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

Sin embargo, debido a que el reloj tiene una resolución finita, el uso del constructor sin parámetros para crear diferentes objetos aleatorios en sucesión cercana crea generadores de números aleatorios que producen secuencias idénticas de números aleatorios.

Por tanto, no utilice este código para generar una serie de números aleatorios.

Respondido el 22 de diciembre de 17 a las 22:12

-1: la semilla predeterminada se basa en el tiempo; haz esto en un bucle y obtendrás resultados muy no aleatorios. Deberías crear una generador y utilícelo para todos sus números, no un generador separado cada vez. - Bevan

Oye, eso es injusto. La pregunta era cómo generar un número int aleatorio. No se mencionaron bucles ni series. - Fiodor Soikin

Ok, buen punto. Rescindido. Aunque, sigo pensando que no usar new Random() en un bucle es un punto importante. - Bevan

Para aquellos que se encuentren con esto en el futuro, debería ser obvio ahora, pero solo lo señalaré; la respuesta se actualizó con este punto, para no usar esto en un ciclo para múltiples valores. - vapcguy

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

Respondido 25 Abr '10, 00:04

¡¡Esto parece una respuesta valiosa subestimada !! - nilón

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

Clase RNGCryptoServiceProvider (MSDN or puntonetperls)

Implementa IDisposable.

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

Respondido el 18 de diciembre de 15 a las 21:12

Podrías usar Jon Skeet's Estático Aleatorio dentro de la biblioteca de clases MiscUtil que construyó para un número pseudoaleatorio.

using MiscUtil;
...

for (int i = 0; i < 100; 
    Console.WriteLine(StaticRandom.Next());

Respondido 15 Feb 20, 20:02

Acabo de echar un vistazo al código fuente, y esta función usa exactamente el mismo motor de números aleatorios, el "incluido" en C #, pero se asegura de que se use el mismo "objeto semilla" / "madre" para todas las llamadas. (Lamento no conocer la terminología de C #. Pero mi punto es que esta función no produce mejores números aleatorios que la función estándar). andreas rejbrand

Es imposible que algo sea 'verdaderamente aleatorio' ya que siempre hay algún factor limitante o prejuicio incluido que es inherente a su propia existencia. ¿No escuchaste al profesor en las clases de ciencias? ;-) - phill healey

Digamos que, según él, esto es lo más 'verdaderamente aleatorio' posible: El niño Mitra

crear un objeto aleatorio

Random rand = new Random();

y úsalo

int randomNumber = rand.Next(min, max);

no tienes que inicializar new Random() cada vez que necesite un número aleatorio, inicie uno aleatorio y luego úselo tantas veces como necesite dentro de un bucle o lo que sea

Respondido el 02 de junio de 20 a las 17:06

new Random() utiliza las garrapatas actuales como semilla. Cuando crea una instancia de varias instancias en el mismo milisegundo (en lugar de marcar), obtendrá el mismo valor devuelto. - Hans Ke st ing

Esto es activamente malo. DateTime.Now.Millisecond (a diferencia de DateTime.Now.Ticks) es un número entre 0 y 999. Si estás creando uno nuevo de estos para cada número aleatorio, solo tendrás 1000 posibilidades. - Oren Melzer

¿Qué estaban pensando 24 personas al votar a favor de esta respuesta ...? - Enigmatividad

Probé todas estas soluciones excluyendo la respuesta COBOL ... jajaja

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

Se trata de la semilla.

Creo un número entero aleatorio 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);
}

Noticias: La siembra no es necesaria si crea una instancia de la clase Random una vez. Por lo tanto, sería mejor crear una clase estática y llamar a un método a partir 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 así ...

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

Admito que me gusta más este enfoque.

Respondido 20 ago 16, 05:08

Guid no es aleatorio, no es una buena semilla. Un GUID no ofrece garantías sobre la aleatoriedad, ofrece garantías sobre la singularidad. stackoverflow.com/questions/2621563/… - Markus

Guid es una buena semilla. Solo estoy usando los números en el Guid. Pruebe el método usted mismo. Colóquelo en un bucle for largo y observe los resultados por sí mismo. - Del mes próximo

Mmmm, pensándolo bien ... la semilla no es necesaria en absoluto. Actualizando respuesta - Del mes próximo

Gran punto en la actualización. Ni siquiera pensé en convertirlo en un campo estático, de esta manera funciona mucho mejor y es más limpio. - jcisar

Hay algunos problemas con esta respuesta. En primer lugar, GUID no es una gran fuente de semillas, solo porque parezca aleatorio no significa que lo sea. Eso puede ser lo suficientemente bueno para sus necesidades personales. En segundo lugar, la clase Random no es segura para subprocesos. Necesita instanciarlo una vez por hilo. - Hector

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

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

Aun así, si todavía necesitas verdadero números aleatorios, necesitará utilizar una fuente externa, como dispositivos que tengan en cuenta la desintegración radiactiva, como 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.

Respondido 22 Jul 15, 16:07

Respuesta modificada de aquí.

Si tiene acceso a una CPU compatible con Intel Secure Key, puede generar cadenas y números aleatorios reales utilizando estas bibliotecas: https://github.com/JebteK/RdRand y https://www.rdrand.com/

Simplemente descargue la última versión de aquí, incluya Jebtek.RdRand y agregue una instrucción using para ello. Entonces, todo lo que necesitas hacer es esto:

// Check to see if this is a compatible CPU
bool isAvailable = RdRandom.GeneratorAvailable();

// Generate 10 random characters
string key       = RdRandom.GenerateKey(10);

 // Generate 64 random characters, useful for API keys 
string apiKey    = RdRandom.GenerateAPIKey();

// Generate an array of 10 random bytes
byte[] b         = RdRandom.GenerateBytes(10);

// Generate a random unsigned int
uint i           = RdRandom.GenerateUnsignedInt();

Si no tiene una CPU compatible para ejecutar el código, simplemente use los servicios RESTful en rdrand.com. Con la biblioteca de envoltorios RdRandom incluida en su proyecto, solo necesitaría hacer esto (obtendrá 1000 llamadas gratis cuando se registre):

string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret   = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");

contestado el 03 de mayo de 19 a las 08:05

Usé el siguiente código para tener un número aleatorio (no recomendado):

var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);

contestado el 31 de mayo de 20 a las 07:05

Mientras esto está bien:

Random random = new Random();
int randomNumber = random.Next()

Querrás controlar el límite (mínimo y máximo de murmullos) la mayor parte del tiempo. Por lo tanto, debe especificar dónde comienza y dónde termina el número aleatorio.

La Next() El método acepta dos parámetros, mínimo y máximo.

Entonces, si quiero que mi número aleatorio esté entre, digamos, 5 y 15, lo haría

int randomNumber = random.Next(5, 16)

Respondido 26 Jul 16, 17:07

Esta es la clase que utilizo. Funciona como RandomNumber.GenerateRandom(1, 666)

internal static class RandomNumber
{
    private static Random r = new Random();
    private static object l = new object();
    private static Random globalRandom = new Random();
    [ThreadStatic]
    private static Random localRandom;
    public static int GenerateNewRandom(int min, int max)
    {
        return new Random().Next(min, max);
    }
    public static int GenerateLockedRandom(int min, int max)
    {
        int result;
        lock (RandomNumber.l)
        {
            result = RandomNumber.r.Next(min, max);
        }
        return result;
    }
    public static int GenerateRandom(int min, int max)
    {
        Random random = RandomNumber.localRandom;
        if (random == null)
        {
            int seed;
            lock (RandomNumber.globalRandom)
            {
                seed = RandomNumber.globalRandom.Next();
            }
            random = (RandomNumber.localRandom = new Random(seed));
        }
        return random.Next(min, max);
    }
}

Respondido 11 Feb 18, 17:02

Su clase GenerateRandom nunca devolverá el número 666, solo 665. Este es un malentendido común (característica) de Random.Next valor máximo. - campana gordon

Solo como nota para referencia futura.

Si usa .NET Core, varias instancias aleatorias no son tan peligrosas como antes. Soy consciente de que esta pregunta es de 2010, pero como esta pregunta es antigua pero tiene cierto atractivo, creo que es bueno documentar el cambio.

Puede consultar esta pregunta que hice hace un tiempo:

¿Microsoft cambió la semilla predeterminada aleatoria?

Básicamente, han cambiado la semilla predeterminada de Environment.TickCount a Guid.NewGuid().GetHashCode(), por lo que si crea 2 instancias de Random, no mostrará los mismos números.

Puede ver las diferencias de archivo de .NET Framework / .NET Core (2.0.0+) aquí: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d

No es tan seguro como RNGCryptoServiceProvider, pero al menos no le dará resultados extraños.

respondido 27 mar '20, 13:03

Esto ahora está desactualizado. Hubo una reacción considerable contra el uso de Guids. El código es ahora Interop.GetRandomBytes((byte*)&result, sizeof(int));. - Enigmatividad

Quería demostrar lo que sucede cuando se usa un nuevo generador aleatorio cada vez. Suponga que tiene dos métodos o dos clases, cada una de las cuales requiere un número aleatorio. E ingenuamente los codificas como:

public class A
{
    public A()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}

¿Crees que obtendrás dos identificaciones diferentes? NOPE

class Program
{
    static void Main(string[] args)
    {
        A a=new A();
        B b=new B();

        int ida=a.ID, idb=b.ID;
        // ida = 1452879101
        // idb = 1452879101
    }
}

La solución es siempre utilice un solo generador aleatorio estático. Como esto:

public static class Utils
{
    public static readonly Random random=new Random();
}

public class A
{
    public A()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}

Respondido 08 Abr '16, 20:04

Entonces, ¿cómo eliges una semilla con seguridad? - Juan Alexiou

Bueno, primero, si sus objetos se crean incluso con 10 ms de diferencia, los números aleatorios generados son diferentes con la semilla predeterminada. En segundo lugar, puede triturar cualquier dato ambiental o de proceso aleatorio que tenga para obtener una semilla. Luego está la compensación de si desea una secuencia larga de números que probablemente comenzará a repetirse, o múltiples flujos, incluso si dos flujos terminan siendo idénticos. Y si le preocupa la seguridad, RNGCryptoServiceProvider es una mejor decisión de todos modos. - millie smith

Sería genial tener un chip aleatorizador con una pequeña fuente radiactiva de partículas alfa y un detector (cómo funciona el detector de humo) para aleatorizar los números según la desintegración radiactiva (que es muy aleatoria). - Juan Alexiou

Para una semilla aleatoria fuerte, siempre uso CryptoRNG y no Time.

using System;
using System.Security.Cryptography;

public class Program
{
    public static void Main()
    {
        var random = new Random(GetSeed());
        Console.WriteLine(random.Next());
    }

    public static int GetSeed() 
    {
        using (var rng = new RNGCryptoServiceProvider())
        {
            var intBytes = new byte[4];
            rng.GetBytes(intBytes);
            return BitConverter.ToInt32(intBytes, 0);
        }
    }
}

contestado el 25 de mayo de 18 a las 18:05

Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);

Respondido el 14 de junio de 18 a las 12:06

Si bien este código puede responder a la pregunta, es mejor explicar cómo resolver el problema y proporcionar el código como ejemplo o referencia. Las respuestas de solo código pueden ser confusas y carecer de contexto. - Roberto Colombia

Los números calculados por una computadora a través de un proceso determinista, por definición, no pueden ser aleatorios.

Si desea números aleatorios genuinos, la aleatoriedad proviene del ruido atmosférico o la desintegración radiactiva.

Puede probar, por ejemplo, RANDOM.ORG (reduce el rendimiento)

respondido 14 mar '16, 13:03

Random rand = new Random();
int name = rand.Next()

Coloque los valores que desee en el segundo paréntesis, asegúrese de haber establecido un nombre escribiendo prop y doble pestaña para generar el código

Respondido 27 Jul 16, 10:07

Por qué prop y doble pestaña? ¿Estás diciendo sin ese atajo de teclado, que es taquigrafía para la propiedad, su código no funcionará? - Sнаđошƒаӽ

Si desea que un CSRNG genere números aleatorios entre un mínimo y un máximo, esto es para usted. Se inicializará Random clases con semillas seguras al azar.

    class SecureRandom : Random
    {
        public static byte[] GetBytes(ulong length)
        {
            RNGCryptoServiceProvider RNG = new RNGCryptoServiceProvider();
            byte[] bytes = new byte[length];
            RNG.GetBytes(bytes);
            RNG.Dispose();
            return bytes;
        }
        public SecureRandom() : base(BitConverter.ToInt32(GetBytes(4), 0))
        {

        }
        public int GetRandomInt(int min, int max)
        {
            int treashold = max - min;
            if(treashold != Math.Abs(treashold))
            {
                throw new ArithmeticException("The minimum value can't exceed the maximum value!");
            }
            if (treashold == 0)
            {
                throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
            }
            return min + (Next() % treashold);
        }
        public static int GetRandomIntStatic(int min, int max)
        {
            int treashold = max - min;
            if (treashold != Math.Abs(treashold))
            {
                throw new ArithmeticException("The minimum value can't exceed the maximum value!");
            }
            if(treashold == 0)
            {
                throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
            }
            return min + (BitConverter.ToInt32(GetBytes(4), 0) % treashold);
        }
    }

Respondido 28 Oct 19, 00:10

Lo siento, OP de hecho requiere un aleatorio int valor, pero con el simple propósito de compartir conocimientos si desea un BigInteger valor puede utilizar la siguiente declaración:

BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));

Respondido el 10 de diciembre de 18 a las 12:12

Hay una serie de funciones o servicios de utilidad que se almacenan mejor en caché de la misma manera que debería estar System.Random, por lo que se presta a una implementación genérica:

static public class CachedService<T> where T : new() {
    static public T Get { get; } = new T();
}

Para usar de forma aleatoria (o similar):

CachedService<System.Random>.Get.Next(999);

Respondido 18 Jul 20, 09:07

Asumiré que desea un generador de números aleatorios distribuido uniformemente como el siguiente. Los números aleatorios en la mayoría de los lenguajes de programación, incluidos C # y C ++, no se mezclan correctamente antes de usarlos. Esto significa que obtendrá el mismo número una y otra vez, lo cual no es realmente aleatorio. Para evitar dibujar el mismo número una y otra vez, necesita una semilla. Por lo general, las garrapatas en el tiempo están bien para esta tarea. Recuerde que obtendrá el mismo número una y otra vez si usa la misma semilla cada vez. Así que trate de usar siempre diferentes semillas. El tiempo es una buena fuente de semillas porque cambian siempre.

int GetRandomNumber(int min, int max)
{
    Random rand = new Random((int)DateTime.Now.Ticks);
    return rand.Next(min, max);
}

Si está buscando un generador de números aleatorios para distribución normal, puede usar una transformación Box-Muller. Verifique la respuesta de yoyoyoyosef en Pregunta aleatoria de variable gaussiana. Como desea un número entero, debe convertir el valor doble en un número entero al final.

Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
         Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
         mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

Variables gaussianas aleatorias

contestado el 22 de mayo de 18 a las 14:05

La forma más fácil es probablemente solo Random.range(1, 3) Esto generaría un número entre 1 y 2.

contestado el 09 de mayo de 19 a las 20:05

Puede probar con un valor de semilla aleatorio usando a continuación:

var rnd = new Random(11111111); //note: seed value is 11111111

string randomDigits = rnd.Next();

var requestNumber = $"SD-{randomDigits}";

Respondido 23 Feb 19, 05:02

Por qué no usar int randomNumber = Random.Range(start_range, end_range) ?

respondido 19 mar '16, 16:03

En realidad int randomNumber = Random.Range (start_range, end_range + 1) - campana gordon

¿Existe Random.Range ()? No pude encontrarlo en la documentación de MSDN. - Felipe Ngan

Usar una instancia de Random repetidamente

// Somewhat better code...
Random rng = new Random();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(GenerateDigit(rng));
}
...
static int GenerateDigit(Random rng)
{
    // Assume there'd be more logic here really
    return rng.Next(10);
}

Este artículo analiza por qué la aleatoriedad causa tantos problemas y cómo abordarlos. http://csharpindepth.com/Articles/Chapter12/Random.aspx

Respondido el 14 de junio de 18 a las 13:06

Random no es una clase segura para subprocesos. Si crea una sola instancia, debe restringir el acceso a ella detrás de un mecanismo de bloqueo. - Brad M

Pruebe estos sencillos pasos para crear números aleatorios:

Crear función:

private int randomnumber(int min, int max)
{
    Random rnum = new Random();
    return rnum.Next(min, max);
}

Utilice la función anterior en una ubicación donde desee utilizar números aleatorios. Suponga que desea usarlo en un cuadro de texto.

textBox1.Text = randomnumber(0, 999).ToString();

0 es mínimo y 999 es máximo. Puede cambiar los valores a lo que desee.

respondido 06 nov., 18:15

Esto devolverá el mismo número cuando se llame varias veces juntas, ya que usa la hora del sistema como semilla ... - MonsDaR

número aleatorio (0, 999) nunca devolverá 999. El valor máximo no es inclusivo. Este es un malentendido común (característica) de Random.Next max value. - campana gordon

Siempre tengo métodos que generan números aleatorios que ayudan para varios propósitos. Espero que esto también te ayude:

public class RandomGenerator  
{  
    public int RandomNumber(int min, int max)  
    {  
        var random = new Random();  
        return random.Next(min, max);  
    }  

    public string RandomString(int size, bool lowerCase)  
    {  
        var builder = new StringBuilder();  
        var random  = new Random();  
        char ch;  

        for (int i = 0; i < size; i++)  
        {  
            ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));  
            builder.Append(ch);  
        }  

        if (lowerCase)  
            return builder.ToString().ToLower();  
        return builder.ToString();  
    }  
}

respondido 17 mar '19, 11:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.