it-swarm.com.de

Werte aus Random.Range () ausschließen?

Wenn Sie Random.Range() verwenden, um Werte zu generieren, gibt es eine Möglichkeit, einige Werte innerhalb des Bereichs auszuschließen (Beispiel: Wählen Sie eine Zahl zwischen 1 und 20, aber nicht zwischen 6 und 8)?

17
Dinovr

Am besten verwenden Sie dazu Ihren Lieblingsgenerator, um eine Ganzzahl n zwischen 1 und 17 zu generieren und dann mit zu transformieren

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

Wenn Sie zwischen 1 und 20 abtasten, können Sie statistische Anomalien einführen. (Zum Beispiel ist Ihre Varianz zu hoch, wenn Ihr Zufallszahlengenerator ein linearer kongruentieller ist: Versuchen Sie es und sehen Sie nach.)

12
Bathsheba

Sie möchten also 17 (20 - 3) unterschiedliche Werte 

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

und Sie können so etwas implementieren:

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

  ...  

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

Im allgemeinen (und komplizierten) Fall schlage ich vor, ein Array aller möglichen Werte zu erzeugen und dann Das Element daraus zu nehmen:

  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)];
10
Dmitry Bychenko

Ja, Sie verwenden einfach where statment in LINQ

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

Andere Weise ohne LINQ

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

EDIT: Jetzt sehe ich keine strenge C # -Frage. Es betrifft Unity und Random. Um die vollständige Antwort zu erhalten, empfehle ich jedoch, Sie verwenden den obigen Code mit Enumerable.Range und verwenden diesen Code, um die Nummer zu generieren:

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

Eine andere Möglichkeit besteht darin, aus den gültigen Rückgabewerten ein Array zu erstellen und dann zufällig eines auszuwählen:

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

EDIT: Ups! Ich habe gerade bemerkt, dass dies für Unity3D war, daher ist dieses Beispiel möglicherweise nicht passend. Es funktioniert jedoch mit der Standardklasse Random.

1
Chris Dunaway

Dadurch wird eine andere Zufallszahl ausgewählt, wenn r im Bereich von 6-8 liegt.

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