PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] Wert ungleich aufteilen



Ricetlin
03.02.2015, 17:57:11
Ich überlege grade wie ich einen zufällige Anzahl an Planeten ungleichmäßig auf ein Eindimensionales-Array mit einzelnen Sonnensysteme aufteilen kann.
Würde das aber gerne einschränken, als einfaches Beispiel: Der Benutzer will 64 Planeten erstellt haben, der Generator soll jetzt aber nicht in ein System 62 Planeten packen und die anderen beiden bekommen nur einen. Sondern alle Systeme sollten Mindestens 1%-4% der Planeten beinhalten.

Ich bin bis dato auf folgendes gekommen (Sprache: C#)

int _planetcount = 64;
float _percentageUsed = 0.0F;
int _SystemsNo = 0;

while (_percentageUsed < 100.0F)
{
float _randPercentage = Random.Range(1.0F, 4.0F);

if(_randPercentage < _percentageUsed)
{
_SystemsNo++;
_percentageUsed = _percentageUsed - _randPercentage;

//////////////
// DO STUFF //
//////////////
}
}

Jetzt bin ich mir aber nicht sicher wie ich die Berechnung durchführen kann.
Die Script Reference (http://docs.unity3d.com/ScriptReference/Array.html) verrät mir aber das builtin-Arrays von Unity statisch sind. Somit kann ich es schon einmal nicht machen wie ich es eigentlich vorhatte.
Nach meinem bisherigen Plan wollte ich die Anzahl der Systeme so herausfinden: Indem ich Zufällige Prozente (auf-/abgerundet und zwischen 1%-4%) vom Grundwert (100%) abziehe bis nichts mehr übrig ist und dabei gleichzeitig dem Array einen neuen Schlüssel und diesem den aktuellen Wert zuweise. Somit hätte ich zur gleichen Zeit die Anzahl der Systeme, als auch die Anzahl der Planeten in jedem System gehabt.

Klappt aber wie gesagt nicht so leicht. Heißt ich muss die Anzahl an Systemen wissen bevor ich das Array erstellen kann. Ich komm gerade aber nicht darauf wie...

Vorher hatte ich die Anzahl der Systeme per Wurzel ziehen errechnet, was auch sehr gut funktioniert hat. Aber leider bekomme ich dann extreme Probleme beim aufteilen der Planeten.
Das ganze ist viel verzwickter als ich dachte... oder habe ich einfach Tomaten auf den Augen?

Hat da wer ne Idee?

eMo
03.02.2015, 20:21:39
Definiere "sollen mindestens 1-4% der Planeten enthalten"! Bedeutet das, dass du mindestens 1%, maximal aber 4% der Planeten pro System haben möchtest? Ich denke nicht. Wenn ich recht habe, lass dir einfach eine Zufallszahl geben und zwar solange, bis sie größer ist als 0.04f. Dann setzt du den Counter deiner Systemzahl eins nach oben..
Ich programmiere etwas in Java, mom.

Edit: Ich sehe gerade, dass du tatsächlich zwischen 1 und 4% der Planeten pro System haben möchtest. Das ist für kleine Planetenzahlen sehr seltsam. Ich baue etwas anderes ;)



public static void verteile(int planetenzahl, int minimalzahl){
double percentageUsed = 0;
double lowestPercentage = (minimalzahl*1.0)/planetenzahl;
System.out.println("lowest Percentage is: "+lowestPercentage);
double zw = 0;
int systemCount = 0, breakInt = 0;
Random random = new Random();
while(percentageUsed < 1){
breakInt++;
zw = random.nextDouble();
if(zw > lowestPercentage && zw < 1-percentageUsed){
systemCount++;
percentageUsed += zw;
breakInt=0;
}
if(breakInt==10){
systemCount++;
percentageUsed = 1;
}
}
System.out.println(systemCount);
}

Soweit, so gut. Da du dich erstmal für die Anzahl an Systemen interessiert hast, hast du nun die Anzahl an Systemen.
Möglich wäre es jetzt, ein Array der Länge systemCount zu erstellen und dann lässt du nochmal eine ähnliche Schleife durchlaufen, die den Prozentsatz an Planeten für das jeweilige Sonnensystem in dieses Array schreibt.
Hast du die Prozent, hast du die Anzahl der Planeten.

Einfacher wäre vermutlich die Implementierung einer Liste in C# als Datenstruktur für Unity :ugly:

Ricetlin
04.02.2015, 13:36:06
Einfacher wäre vermutlich die Implementierung einer Liste in C# als Datenstruktur für Unity :ugly:

... verdammt, also doch Tomaten auf den Augen :X
Grund meiner spontanen Begeisterung ist der das ich bereits eine Liste für Planeten und sämtliche der Eigenschaften aufgestellt habe. Ich muss sie nur noch mit Inhalten fühlen.

Natürlich bin ich im Leben nicht darauf gekommen die dafür zu verwenden :X

Okay, ich danke dir schon mal so weit. Ich werd mich dann mal da rein arbeiten :)