Zufällige Verteilung auf festgelegte Menge
Hallo,
Ich versuche das an einem Beispiel zu erklären:
Es gibt 15000 Äpfel.
diese sollen auf 300 Kinder zufällig verteilt werden.
dabei muss aber jedes Kind mindestens 2 Äpfel und höchstens 1000 Äpfel bekommen.
Die Verteilung ist geglückt, wenn 0 bis 2 Äpfel übrig bleiben.
Mein Ansatz war jetzt hierbei,
for i=0; i<300;i++
anteil = rand (2,1000)
ÄPFEL -= anteil
Aber das Skript läuft nun schon einige Stunden. Zugegeben sind die Zahlen dort andere ();
Zur Orientierung: bei den echten Zahlen liegt ÄPFEL / Kinder bei etwa 3% des Zuteilungsbereiches.
Hat jemand eine Idee, wie man das lösen könnte?
Voraussetzung, ist dass die Zuteilung tatsächlich zufällig erfolgt (wobei die obere und untere Grenze durchaus variabel ist)
Es handelt sich hier übrigens um ein Realproblem, nicht um eine Informatikaufgabe ;)
Ich versuche das an einem Beispiel zu erklären:
Es gibt 15000 Äpfel.
diese sollen auf 300 Kinder zufällig verteilt werden.
dabei muss aber jedes Kind mindestens 2 Äpfel und höchstens 1000 Äpfel bekommen.
Die Verteilung ist geglückt, wenn 0 bis 2 Äpfel übrig bleiben.
Mein Ansatz war jetzt hierbei,
anteil = rand (2,1000)
ÄPFEL -= anteil
Aber das Skript läuft nun schon einige Stunden. Zugegeben sind die Zahlen dort andere ();
Zur Orientierung: bei den echten Zahlen liegt ÄPFEL / Kinder bei etwa 3% des Zuteilungsbereiches.
Hat jemand eine Idee, wie man das lösen könnte?
Voraussetzung, ist dass die Zuteilung tatsächlich zufällig erfolgt (wobei die obere und untere Grenze durchaus variabel ist)
Es handelt sich hier übrigens um ein Realproblem, nicht um eine Informatikaufgabe ;)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 388811
Url: https://administrator.de/contentid/388811
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo,
das ist mit den Informationen fummelig, weil es vermutlich um 2 Ecken gedacht ist.
Und echte Zufallszahlen sind nicht so ganz einfach. Spielt hier wohl aber keine Rolle.
Ich würde, muss ja nicht perfekte Lösung sein, es so machen:
- Ein Array of Word mit 300 Einträge und alle mit 2 initialisieren (Mindestmenge)
Sonst könnte es passieren, dass die ersten 15 Kinder 1000 Äpfel bekommen und die anderen nix.
AepfelRest = 15000 - (300 * 2)
Nun eine Endlosschleife
Darin eine Schleife for to von 0 bis 299
Jedem Eintrag des Arrays einen zufälligen Wert von 0 bis 10 addieren und von AepfelRest abziehen.
Je größer 10 ist umso größer werden die Abweichungen der einzelnen Wert sein.
Prüfen bei jeder Zahl ob man damit in den negativen Bereich kommt, dann neue zufällige Zahl erzeugen.
Wenn der Restwert zwischen 0 und 2 ist, die Schleife abbrechen und Ende.
Stefan
das ist mit den Informationen fummelig, weil es vermutlich um 2 Ecken gedacht ist.
Und echte Zufallszahlen sind nicht so ganz einfach. Spielt hier wohl aber keine Rolle.
Ich würde, muss ja nicht perfekte Lösung sein, es so machen:
- Ein Array of Word mit 300 Einträge und alle mit 2 initialisieren (Mindestmenge)
Sonst könnte es passieren, dass die ersten 15 Kinder 1000 Äpfel bekommen und die anderen nix.
AepfelRest = 15000 - (300 * 2)
Nun eine Endlosschleife
Darin eine Schleife for to von 0 bis 299
Jedem Eintrag des Arrays einen zufälligen Wert von 0 bis 10 addieren und von AepfelRest abziehen.
Je größer 10 ist umso größer werden die Abweichungen der einzelnen Wert sein.
Prüfen bei jeder Zahl ob man damit in den negativen Bereich kommt, dann neue zufällige Zahl erzeugen.
Wenn der Restwert zwischen 0 und 2 ist, die Schleife abbrechen und Ende.
Stefan
Hi,
Warum nicht einfach eine Schleife für jeden verbleibenden Apfel und eine Zahl von 0 bis 299 "zufällig" berechnen, um den Empfänger zu bestimmen.
z.B. in VB.Net
E.
Zitat von @StefanKittel:
- Ein Array of Word mit 300 Einträge und alle mit 2 initialisieren (Mindestmenge)
Sonst könnte es passieren, dass die ersten 15 Kinder 1000 Äpfel bekommen und die anderen nix.
Diesen Ansatz halte ich schon mal für gut.- Ein Array of Word mit 300 Einträge und alle mit 2 initialisieren (Mindestmenge)
Sonst könnte es passieren, dass die ersten 15 Kinder 1000 Äpfel bekommen und die anderen nix.
Nun eine Endlosschleife
Darin eine Schleife for to von 0 bis 299
Jedem Eintrag des Arrays einen zufälligen Wert von 0 bis 10 addieren und von AepfelRest abziehen.
Je größer 10 ist umso größer werden die Abweichungen der einzelnen Wert sein.
Diesen jedoch für zu fummelig.Darin eine Schleife for to von 0 bis 299
Jedem Eintrag des Arrays einen zufälligen Wert von 0 bis 10 addieren und von AepfelRest abziehen.
Je größer 10 ist umso größer werden die Abweichungen der einzelnen Wert sein.
Warum nicht einfach eine Schleife für jeden verbleibenden Apfel und eine Zahl von 0 bis 299 "zufällig" berechnen, um den Empfänger zu bestimmen.
z.B. in VB.Net
While Rest > 0
ZielNr = Cint(RND * 299)
ZielArray(ZielNr) += 1
Rest -= 1
Wend
E.