¿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