unity numeros numero mathf generar aleatorios aleatorio c# random unity3d

numeros - random in c# unity



Excluir valores de Random.Range()? (6)

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


Esto seleccionará un número aleatorio diferente si r está en el rango 6-8 inclusive.

int r = 0; do { r = Random.Next(20); } while (r >= 6 && r <= 8)


La mejor forma de hacerlo es usar tu generador favorito para generar un entero n entre 1 y 17 y luego transformar usando

if (n > 5){ n += 3; }

Si muestras entre 1 y 20, descarta los valores, puedes introducir anomalías estadísticas. (Por ejemplo, su varianza será demasiado alta si su generador de números aleatorios es congruente lineal: pruébelo y vea).


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

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! Solo noté que esto era para Unity3D, por lo que este ejemplo podría no ser apropiado. Sin embargo, funciona usando la clase Random estándar.


Sí, tu uso simple where declaración en LINQ

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

Otra manera sin LINQ

public IEnumerable RangeBetween() { foreach (var i in Enumerable.Range(1, 20)) { if (i < 6 || i > 8) { yield return i; } } }

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

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


Voy a arrojar mis 2 centavos sobre el tema. Aquí hay una clase completa que muestra un método que genera un número aleatorio que excluye los números que usted elija y cómo usarlos.

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


Entonces 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 general (y complicado) caso sugiero generar una matriz de todos los valores posibles y luego tomar el elemento de la misma:

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