C# Programm das gerecht Verteilen kann?

2 Antworten

Ich verzichte auf eine "Rahmenstruktur" mit verschiedenen "Früchten". Es geht ja schließlich nur um das möglichst gleichmäßige verteilen auf eine Liste (Kinder).

Das diese Methode benutze ich gewöhnlich unter Powershell um große (Datei)Listen auf mehrere Jobs zu verteilen. https://www.gutefrage.net/frage/die-ersten-20-zeilen-von-txt-datein-automatisch-loeschen-lassen#answer-518577030

Ob man nun Dateien auf Jobs verteilt, oder Bananen auf Kinder ist dabei unerheblich...

Long habe ich Verwendet damit Du auch Reiskörner auf die Weltbevölkerung verteilen kannst...🤣

using System;
using System.Collections.Generic;


class Prog{

    public static List<long> getParts( long Size , long Parts ){
        List<long> p = new List<long>(); //liste, welche die einzelnen Teile zwischenspeichert
        long Teil = (long) Math.Floor((decimal)Size / Parts); //Anzahl bei gleichmäßiger Verteilung (abrunden!)
        long Rest = Size % Parts; //Rest, der sich nicht geichmäßig verteilen ließ

        for (long i=0;i<Parts;i++){ //verteile den den Rest 
            if ( Rest > 0 ){        //solange noch  was übrig  ist
                p.Add( Teil + 1 );  //...Teil + 1 in Liste speichern
                Rest--;             // Rest um 1 reduzieren
            }
            else p.Add( Teil );     //ist vom Rest nichts mehr übrig, ursprüngliche Teilmenge in Liste.
        }
        return p; //Liste als Ergebnis der Methode zurückgeben
    }
    
    public static void Main(string[] args){
        int AnzahlKinder = 3;
        
        int AnzahlAepfel = 2;
        Console.WriteLine("Verteilung der Äpfel auf  die Kinder");
        foreach (long Kind in getParts(AnzahlAepfel,AnzahlKinder)){
            Console.WriteLine(Kind);
        }

        int AnzahlBananen = 22;
        Console.WriteLine("Verteilung der Bananen auf  die Kinder");
        foreach (long Kind in getParts(AnzahlBananen,AnzahlKinder)){
            Console.WriteLine(Kind);
        }

        Console.ReadKey();
    }
}


AlexCoolalex 
Fragesteller
 20.10.2023, 11:24

Danke, das hat mich echt weitergebracht. Jetzt ist nur das Problem: Die Gesamtzahl von Obst und die Obstart wie viel jedes Kind bekommt darf sich höchstens um 1 ändern. Wie könnte ich das erfragen und dann in der Verteilung korrigieren?

0

Ein erster einfacher Ansatz wäre der, je Obstsorte so oft über die vorhandenen Tüten zu iterieren (und dabei jeweils eine Frucht hineinzulegen), bis es keine verfügbaren Früchte der Sorte mehr gibt.

Wenn es dabei mehr Tüten als Früchte je Sorte gibt (bei deinem Beispiel wäre das z.B. ab vier Tüten der Fall), würde das allerdings auch bedeuten, dass einzelne Tüten stets leer ausgehen. Es sei denn, du zerlegst erst die Früchte (Anzahl Früchte / Anzahl Tüten) und teilst die Fragmente anschließend entsprechend auf.

So lange du nichts zerlegst, also nicht mit Fließkommazahlen arbeitest, wäre der Typ int statt double eher angebracht. Das du als Anfänger ein Array wählst, um die Mengen zu repräsentieren, ist in Ordnung.

Sobald du dich mit Collections oder dem Schreiben eigener komplexen Datentypen beschäftigst, wäre ein Dictionary / eine Klasse besser geeignet, da du die Zahlen dann einem besser verständlichen Key zuordnen kannst.