wpforge
Goto Top

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 ;)

Content-Key: 388811

Url: https://administrator.de/contentid/388811

Printed on: April 16, 2024 at 22:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus Oct 08, 2018 at 22:30:56 (UTC)
Goto Top
Tatsächlich zufällig gibt es tatsächlich nicht.

Was ist denn das Realproblem?

VG
Member: StefanKittel
Solution StefanKittel Oct 08, 2018 at 22:47:12 (UTC)
Goto Top
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
Member: emeriks
emeriks Oct 09, 2018 updated at 05:31:53 (UTC)
Goto Top
Hi,
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.

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.
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.
Member: WPFORGE
WPFORGE Oct 09, 2018 at 08:33:20 (UTC)
Goto Top
Es soll für ein Experiment Spielgeld verteilt werden.
Dabei geht es um etwa 170 mio einheiten, die unter ca. 3500 Teilnehmern zufällig ("Computerzufällig" reicht hier) aufgeteilt werden sollen.
Dabei soll jeder min 100 Einheiten, höchstens aber 1,5 mio einheiten erhalten.
Member: WPFORGE
WPFORGE Oct 09, 2018 at 08:34:42 (UTC)
Goto Top
Die Idee gefällt mir ;)

Danke.