visual una repetir propiedad para número numeros numero matriz llenar generar ejemplos digitos con algoritmo aleatorios aleatorio c# random

c# - propiedad - llenar una matriz con numeros aleatorios sin repetir en c



Múltiples números aleatorios son lo mismo (7)

La razón por la que esto sucede es que cada vez que haces un nuevo Random , se inicializa usando el reloj. Entonces en un ciclo cerrado (o muchas llamadas una después de la otra) obtienes el mismo valor muchas veces ya que todas esas variables aleatorias se inicializan con la misma inicialización.

Para resolver esto: cree solo una variable Aleatoria, preferiblemente fuera de su función y use solo esa instancia.

Random random1 = new Random(); private void Draw() { int randomNumber1 = random1.Next(0, 300); int randomNumber2 = random1.Next(0, 300); int randomNumber3 = random1.Next(0, 300); int randomNumber4 = random1.Next(0, 300); System.Drawing.Graphics g = this.CreateGraphics(); Pen green = new Pen(Color.Green, 5); g.DrawLine(green, new Point(randomNumber1, randomNumber2), new Point(randomNumber3, randomNumber4)); }

Posible duplicado:
Generador de números aleatorios que solo genera un número aleatorio

Una pregunta para principiantes. Tengo un programa muy simple que dibuja una línea y quiero aleatorizar las ubicaciones, pero cada vez que creo una nueva instancia de Aleatorio, devuelve el mismo valor. ¿Dónde está el problema? Gracias.

private void Draw() { Random random1 = new Random(); int randomNumber1 = random1.Next(0, 300); Random random2 = new Random(); int randomNumber2 = random2.Next(0, 300); Random random3 = new Random(); int randomNumber3 = random3.Next(0, 300); Random random4 = new Random(); int randomNumber4 = random4.Next(0, 300); System.Drawing.Graphics g = this.CreateGraphics(); Pen green = new Pen(Color.Green, 5); g.DrawLine(green, new Point(randomNumber1, randomNumber2), new Point(randomNumber3, randomNumber4)); } private void btndraw1_Click(object sender, EventArgs e) { Draw(); }


No debe crear un nuevo objeto Random para cada número. En cambio, usa el mismo objeto:

Random r = new Random(); private void Draw() { // Create 4 random numbers int[] numbers = Enumerable.Range(0, 4).Select(x => r.Next(0, 300)).ToArray(); System.Drawing.Graphics g = this.CreateGraphics(); Pen green = new Pen(Color.Green, 5); g.DrawLine(green, new Point(numbers[0], numbers[1]), new Point(numbers[2], numbers[3])); }


Qué clase aleatoria de .Net necesita es un valor de inicialización, puede usar un valor de fecha como semilla y funcionaría.

private void Draw() { Random random1 = new Random(unchecked((int)DateTime.Now.Ticks << (int)100)); int randomNumber1 = random1.Next(0, 300); Random random2 = new Random(unchecked((int)DateTime.Now.Ticks << (int)200)); int randomNumber2 = random2.Next(0, 300); Random random3 = new Random(unchecked((int)DateTime.Now.Ticks << (int)300)); int randomNumber3 = random3.Next(0, 300); Random random4 = new Random(unchecked((int)DateTime.Now.Ticks << (int)400)); int randomNumber4 = random4.Next(0, 300); System.Drawing.Graphics g = this.CreateGraphics(); Pen green = new Pen(Color.Green, 5); g.DrawLine(green, new Point(randomNumber1, randomNumber2), new Point(randomNumber3, randomNumber4)); } private void btndraw1_Click(object sender, EventArgs e) { Draw(); }


Simplemente use la misma instancia:

Random random = new Random(); int randomNumber1 = random.Next(0, 300); int randomNumber2 = random.Next(0, 300); //...

Los números aleatorios en la programación no son realmente aleatorios; se basan en una semilla única que se toma y manipula para generar lo que parece ser un conjunto de números aleatorios. Usar la misma semilla dará como resultado el mismo conjunto de números.

El constructor predeterminado de la clase Random usa la cantidad de milisegundos transcurridos desde que el sistema comenzó como la semilla, por lo que lo que sucedió realmente es que se usó la misma semilla.

Realmente no hay razón para crear más de una instancia Random ; la instancia única generará un conjunto aleatorio de números en cada ejecución del código.

Para probar mi declaración anterior de la semilla predeterminada, utilicé la reflexión:

// System.Random /// <summary>Initializes a new instance of the <see cref="T:System.Random" /> class, using a time-dependent default seed value.</summary> public Random() : this(Environment.TickCount) { }

Y el Environment.TickCount :

// System.Environment /// <summary>Gets the number of milliseconds elapsed since the system started.</summary> /// <returns>A 32-bit signed integer containing the amount of time in milliseconds that has passed since the last time the computer was started.</returns> /// <filterpriority>1</filterpriority> public static extern int TickCount { [SecuritySafeCritical] [MethodImpl(MethodImplOptions.InternalCall)] get; }


Solo necesitas una instancia de la clase Aleatoria.

private void Draw() { Random random1 = new Random(); int randomNumber1 = random1.Next(0, 300); int randomNumber2 = random1.Next(0, 300); int randomNumber3 = random1.Next(0, 300); int randomNumber4 = random1.Next(0, 300); System.Drawing.Graphics g = this.CreateGraphics(); Pen green = new Pen(Color.Green, 5); g.DrawLine(green, new Point(randomNumber1, randomNumber2), new Point(randomNumber3, randomNumber4)); } private void btndraw1_Click(object sender, EventArgs e) { Draw(); }


Un generador de números aleatorios (RNG) en realidad no genera números aleatorios. En cambio, utiliza un algoritmo para definir una secuencia de números, que parecen ser aleatorios. Esta secuencia depende de la seed que se ejecuta a través de dicho algoritmo en el momento en que se crea RNG.

Por defecto, los RNG se crean utilizando el reloj del sistema como semilla, ya que el reloj generalmente variará cada vez que se ejecute el programa, lo que hace extremadamente difícil predecir la secuencia "aleatoria".

En su caso, es muy probable que el reloj no haya cambiado entre crear un objeto aleatorio y otro; posiblemente debido a un reordenamiento de las instrucciones interno de la CPU.

Como afirma Blachshma, lo mejor es crear solo un objeto aleatorio y usar solo eso.

public static Random MyRNG = new Random(); // create a single static random object, that you can use across all classes private void Draw() { randomNumber1 = MyRNG.Next(0, 300); randomNumber2 = MyRNG.Next(0, 300); // and so forth }

Tenga en cuenta que no se garantiza que ninguna instancia de System.Random sea ​​segura para subprocesos, lo que significa que si planea que varios subprocesos compartan el mismo objeto aleatorio, debe bloquearlo.

lock (MyRNG) { randomNumber = MyRNG.Next(0, 300); }

De lo contrario, podría romper su objeto aleatorio, lo que provocaría que las llamadas consiguientes devuelvan solo 0 como resultado.


private static readonly Random Random1 = new Random(); private void Draw() { int randomNumber1 = Random1.Next(0, 300); int randomNumber2 = Random1.Next(0, 300); int randomNumber3 = Random1.Next(0, 300); int randomNumber4 = Random1.Next(0, 300); System.Drawing.Graphics g = this.CreateGraphics(); Pen green = new Pen(Color.Green, 5); g.DrawLine(green, new Point(randomNumber1, randomNumber2), new Point(randomNumber3, randomNumber4)); } private void btndraw1_Click(object sender, EventArgs e) { Draw(); }