En este momento estás viendo ¿Eliminar valores de Random.Range()?

 – Unity

¿Eliminar valores de Random.Range()? – Unity

¿Eliminar valores de Random.Range()?

– UnityAssets3Free

hola , por aqui Camilo y en esta ocasion os traigo
nueva pregunta

si estás usando Random.Range() para generar valores, ¿hay alguna forma de excluir algunos valores dentro del rango (por ejemplo, elegir un número entre 1 y 20 pero no 6 a 8)?

7 respuestas 7

La mejor manera de hacer esto es usar su generador favorito para generar un número entero n entre 1 y 17, luego transforme usando

if (n > 5)
    n += 3;

Si muestrea entre 1 y 20 y descarta los valores, puede introducir anomalías estadísticas, especialmente con secuencias de discrepancia baja.

Así que realmente quieres 17 (20 – 3) valores diferentes

  [1..5] U [9..20]

y puedes implementar algo como esto:

  // Simplest, not thread-safe
  private static Random random = new Random();

  ...  

  int r = (r = random.Next(1, 17)) > 5
    ? r + 3
    : r;

En el caso general (y complicado), sugiero generar una matriz de todos los valores posibles y luego tomar el elemento de ella:

  int[] values = Enumerable
    .Range(1, 100) // [1..100], but
    .Where(item => item % 2 == 1) // Odd values only
    .Where(item => !(item >= 5 && item <= 15)) // with [5..15] range excluded
    //TODO: Add as many conditions via .Where(item => ...) as you want
    .ToArray();

  ...

  int r = values[random.Next(values.Length)];

si usas simple where declaración en LINQ

   var list = Enumerable.Range(1, 20).Where(a => a < 6 || a > 8).ToArray();

Otra forma sin LINQ

        public IEnumerable RangeBetween()
        
            foreach (var i in Enumerable.Range(1, 20))
             i > 8)
                
                    yield return i;
                
            
        

EDITAR: Ahora veo que no es una pregunta estricta de C#. Afecta Unity y Random. Pero para una respuesta completa, le sugiero que use el código anterior con Enumerable.Range y luego use esto para generar el número:

list[Random.Next(list.Length)];

Otra forma es hacer una matriz de los valores de retorno válidos y luego seleccionar uno al azar:

void Main()

    var rng = new Random();
    var validValues = Enumerable.Range(1, 20).Except(new int[] 6, 7, 8).ToArray();

    for (int i = 0; i < 25; i++)
    
        Console.Write(validValues[rng.Next(0, validValues.Length)]);
        Console.Write(" ");
    

EDITAR: ¡Ups! Acabo de notar que esto era para Unity3D, por lo que este ejemplo podría no ser apropiado. Funciona usando el valor predeterminado. Random clase sin embargo.

Esto elegirá un número aleatorio diferente si r está en el rango de 6 a 8, inclusive.

int r = 0;
do

    r = Random.Next(20);
 while (r >= 6 && r <= 8)

Voy a dar mis 2 centavos en el asunto. Aquí hay una clase completa que muestra un método que genera un número aleatorio excluyendo números de su elección y cómo usarlo.

using UnityEngine;
using System.Collections.Generic;
using System.Linq;

public class test2 : MonoBehaviour 

    System.Random rand;
    int[] excludelist;
    void Start()
    
         rand = new System.Random();
        excludelist = new int[]  5,9,3;
        for(int i = 0; i<20;i++)
        
            Debug.Log(MakeMeNumber(excludelist));
        

    
    private int MakeMeNumber(params int[] excludeList)
    
        var excluding = new HashSet<int>(excludeList);
        var range = Enumerable.Range(1, 20).Where(i => !excluding.Contains(i));


        int index = rand.Next(0, 20 - excluding.Count);
        return range.ElementAt(index);
    

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

sin mas,espero que te funcione

Deja una respuesta