Jump to content
Unity Insider Forum

Zufallszahlen mit Schrittgrößen


Lightstorm

Recommended Posts

Ich möchte int und float Zufallszahlen haben die mit den Angaben min, max und step begrenzt werden.

Eine Zahl zwischen min und max zu bekommen ist kein Problem, mit Random.Range(min, max). Aber die Schrittgröße ist das Problem. Unity bietet soweit ich weiß keine Random Funktion mit step Angabe. Ich habe natürlich etwas Google benutzt und habe auch einige Codes gefunden, aber keines davon scheint wirklich zu überzeugen. Das beste was ich fand ist das:

 int minSpawnHealth = 10;
 int maxSpawnHealth = 30;
 int stepSize = 5;
 
 int GetRandomHealth () {
     int randomHealth = Random.Range(minSpawnHealth, maxSpawnHealth);
     int numSteps = Mathf.Floor (randomHealth / stepSize);
     int adjustedHealth = numSteps * stepSize;
 
     return adjustedHealth;
 }

Aber es funktioniert irgendwie nicht perfekt. Gibt man z.B. min=0, max=2 und step=1 an so erzeugt es nur die Zufallszahlen 0 und 1. Die 2 kommt nie vor.

Ist dieses Verhalten normal? Max bedeutet für mich dass dies die noch zuletzt erlaubte Zahl ist. Und bei einer Schritten muss es doch auch vorkommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ließe sich ja mit einem einfachen y+1 beheben. Bei min=1, max=4+1, steps=2 werden die Zahlen 0, 2 und 4 generiert. Warum die 0?

Wenn ich 4 statt 4+1 benutze werden die Zahlen 0 und 2 generiert.

Und wenn ich mich nicht irre hatte ich bei float Zahlen auch komische Ergebnisse abhängig davon ob es gerade oder ungerade Zahlen waren.

Hatte dann herum probiert und das hier gefrickelt (min, max und step sind float):

            if (min == max)
                return min;

            if (min != max && step == 0)
                step = 1;

            float random;
            if (step % 2 == 0)
                random = Random.Range(min, max + 1);
            else
                random = Random.Range(min, max + step);

            float numSteps = Mathf.Floor(random / step);
            return numSteps * step;

 

Damit schien es in einigen Versuchen richtig zu funktionieren. Habe aber keine Gewissheit und verstehe die Logik darin ehrlich gesagt auch nicht :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Lightstorm:

Bei min=1, max=4+1, steps=2 werden die Zahlen 0, 2 und 4 generiert. Warum die 0?

Öh... habe schon mehrere Male etwas geschrieben, hab's dann aber wieder gelöscht, ohne es abzuschicken. Anstatt groß darüber nachzudenken, würde ich die Herangehensweise leicht ändern.

public static int RandomWithSteps(int min, int max, int interval)
{
  var range = max - min;
  var maxIntervalCount = range / interval;
  var intervalCount = Random.Range(0, maxIntervalCount + 1);
  return min + intervalCount * interval;
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Minuten schrieb Sascha:

Öh... habe schon mehrere Male etwas geschrieben, hab's dann aber wieder gelöscht, ohne es abzuschicken. Anstatt groß darüber nachzudenken, würde ich die Herangehensweise leicht ändern.


public static int RandomWithSteps(int min, int max, int interval)
{
  var range = max - min;
  var maxIntervalCount = range / interval;
  var intervalCount = Random.Range(0, maxIntervalCount + 1);
  return min + intervalCount * interval;
}

 

Hm. Bei min=1, max=4, interval=2 wird damit nur die 4 generiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...