Es kommt ein bisschen darauf an, was Du repräsentieren möchtest...
Hier hast Du offenbar Felder in der Größenordnung von 15. Du nimmst eine Zufallszahl von 0 bis 1000. Die Werte bis 135 zeichnen Besonderheiten aus.
Also statistisch 13,5% sind besonders. In Deiner Implementierung können aber auch überall Besonderheiten sein oder nirgendwo, ist ja zufällig.
Wenn man exakt 13,5% haben wollte, könnte man 13,5%*21*21 also 60 zufällige Felder nehmen und dort eine zufällige Anomalie positionieren. Das reduziert den Aufwand von 421 Schleifendurchläufen auf 60. Aber das macht halt auch was anderes.
Ansonsten hast Du in 86,5% der Fälle keine Anomalie, der Fall ist also hochwahrscheinlich - den würde ich also bevorzugt abfangen, das erspart Dir nämlich die folgenden 9 Abfragen. Die erste Abfrage passt nämlich nur in 1,5% der Fälle, ist also hochwahrscheinlich nicht zielführend, weswegen die Frage möglichst zuletzt gestellt werden sollte.
Du hast 9 Anomalien. 9 entspricht also 13,5%. 100% entspricht dann 66,666. Die Zahl ist nicht schön, aber damit umgehen wir die 15er Schritte. Anders ausgedrückt 1000/15 = 66,666.
Code: Alles auswählen
for (var i = 0; i < 21 * 21; i++) {
var rnd = Math.floor(Math.random() * 66,666);
if( rnd >= 10 ) map[i] = "space.webp";
else if (rnd < 1) map[i] = "anomaly10.webp";
else if (rnd < 2) map[i] = "anomaly02.webp";
else if (rnd < 3) map[i] = "anomaly03.webp";
else if (rnd < 4) map[i] = "anomaly04.webp";
else if (rnd < 5) map[i] = "anomaly05.webp";
else if (rnd < 6) map[i] = "anomaly06.webp";
else if (rnd < 7) map[i] = "anomaly07.webp";
else if (rnd < 8) map[i] = "anomaly08.webp";
else if (rnd < 9) map[i] = "anomaly09.webp";
}
Jetzt sieht man noch 9 Abfragen. Das könnt man als binäre Suche aufziehen:
Code: Alles auswählen
if (rnd < 5)
{
if( rnd <2 )
{
if (rnd == 0) map[i] = "anomaly10.webp";
else map[i] = "anomaly02.webp";
}
else
{
if (rnd == 2) map[i] = "anomaly03.webp";
else if (rnd == 3) map[i] = "anomaly04.webp";
else map[i] = "anomaly05.webp";
}
}
else if (rnd < 7)
{
if (rnd == 5) map[i] = "anomaly06.webp";
else map[i] = "anomaly07.webp";
}
else
{
if (rnd == 7) map[i] = "anomaly08.webp";
else map[i] = "anomaly09.webp";
}
}
Während Du in Deinem Code also 9 Abfragen in 86,5% der Fälle hast, hat so ein Code maximal 5 Abfragen in 13,5% der Fälle.
Je nach Compilerimplementation macht der Compiler das für einen per Switch. Es kann aber auch eine if-elseif Geschichte draus werden.
Code: Alles auswählen
switch( rnd )
{
case 0: map[i] = "anomaly10.webp"; break;
case 1: map[i] = "anomaly02.webp"; break;
case 2: map[i] = "anomaly03.webp"; break;
case 3: map[i] = "anomaly04.webp"; break;
case 4: map[i] = "anomaly05.webp"; break;
case 5: map[i] = "anomaly06.webp"; break;
case 6: map[i] = "anomaly07.webp"; break;
case 7: map[i] = "anomaly08.webp"; break;
case 8: map[i] = "anomaly09.webp"; break;
}
[/quote]
Aber man erkennt im ursprünglichen Code auch eine gewisse Redundanz, sobald man die 15er-Schritte rausgenommen hat. Die kann man ausnutzen:
[code]
char const * anomaly[] = { "anomaly10.webp", "anomaly02.webp", "anomaly03.webp",
"anomaly04.webp", "anomaly05.webp", "anomaly06.webp", "anomaly07.webp",
"anomaly08.webp", "anomaly09.webp" };
for (var i = 0; i < 21 * 21; i++)
{
var rnd = Math.floor(Math.random() * 66,666);
if( rnd >= 10 ) map[i] = "space.webp";
else map[i] = anomay[rnd];
}
[/quote]
Das reduziert die Abfragen auf genau eine pro Feld.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.