Zahlen in Fraktale zerlegen

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Rikudo.

    Zahlen in Fraktale zerlegen

    Moin :)

    Also ich bräuchte mal in bisschen theoretischen Input wie ich meine Idee umsetzen könnte ^^
    Und zwar Folgendes:
    Meine Funktion soll eine Signatur haben die wie folgt aussieht:

    C#-Quellcode

    1. public static int[] BerechneKrimsKrams(int a)


    Nehmen wir an wir haben eine Input Zahl 3000.
    Diese Zahl soll nun in 5 Fraktale zerlegt werden die ca. gleich groß sind (genau geht ja nicht immer abhängig vom input).
    Die Fraktale sollen aufaddiert den Input ergeben.
    Also wenn mein Input 3000 war, könnte ein Output Array (das immer aus 5 Elementen bestehen muss) wie folgt aussehen:

    Quellcode

    1. 586
    2. 621
    3. 609
    4. 540
    5. 644


    Denn 586 + 621 + 609 + 540 + 644 = 3000.

    Mit "ca. gleich groß" meine ich das Ausgaben wie 1+2+1+1+2995 vermieden werden sollten :D
    Wie setze ich so etwas effizient um?
    Hat da jemand ein paar Vorschläge :) ?
    C# Developer
    Learning C++
    Schnelle Überlegung wäre diese:

    C#-Quellcode

    1. private static int[] Fraktale(int a, int count)
    2. {
    3. var list = new List<int>();
    4. var fraktal = a / count;
    5. var dif = a - (fraktal * count);
    6. for (int i = 0; i < count; i++)
    7. {
    8. list.Add(fraktal);
    9. }
    10. list[list.Count - 1] += dif;
    11. return list.ToArray();
    12. }
    Bilder
    • 2015-12-04 15_33_11-ConsoleApplication1(wird ausgeführt) - Microsoft Visual Studio.png

      33,73 kB, 678×362, 156 mal angesehen
    @ThuCommix : Danke das sieht schonmal nach einem interessanten Ansatz aus, würde dir spontan einen
    Möglichkeit einfallen um die einzelnen Werte noch etwas voneinander abweichen zu lassen?
    z.B. +-15 oder so (abhängig vom input natürlich bei kleineren Zahlen geht das nicht)
    C# Developer
    Learning C++
    Noch eine schnelle Idee.. ist Fehleranfällig wenn die Variation oder der Count zu groß wird.

    C#-Quellcode

    1. private static Random random = new Random();
    2. private static int[] Fraktale(int a, int count, double variation)
    3. {
    4. var list = new List<int>();
    5. var fraktal = a / count;
    6. var intVariation = (int)(variation * 100);
    7. for (int i = 0; i < count - 1; i++)
    8. {
    9. list.Add((int)(fraktal * (random.Next(100-intVariation, 100 + intVariation)/100f)));
    10. }
    11. var total = list.Sum();
    12. list.Add(a - total);
    13. return list.ToArray();
    14. }

    Bilder
    • 2015-12-04 15_48_14-file____C__Users_k.scholz_Documents_Visual Studio 2015_Projects_ConsoleApplicati.png

      32,47 kB, 671×284, 132 mal angesehen
    @ThuCommix : hey ncie genau so etwas in der Art wollte ich :D
    Du sagst das ganze ist jedoch Fehleranfällig..
    Bis zu welcher Variation ist es denn 100% sicher das die Summe der Output Werte gleich dem Input Wert entsprechen?
    C# Developer
    Learning C++
    Hab gerade ein paar Tests gemacht:

    Fehleranfälligkeit steigt wenn sich Count sehr nah an A befindet und eine hohe Variation besteht.. Teste es einfach mal mit 100, 99, 0.9f aus.

    Beheben könnte man das indem man den Übertrag (total) auf die ganzen einzelnen Fraktale nochmals verteilt.


    Bis zu welcher Variation ist es denn 100% sicher das die Summe der Output Werte gleich dem Input Wert entsprechen?


    Immer, aber die Werte sind dann nicht mehr schön.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThuCommix“ ()

    ThuCommix schrieb:

    Hab gerade ein paar Tests gemacht:

    Fehleranfälligkeit steigt wenn sich Count sehr nah an A befindet und eine hohe Variation besteht.. Teste es einfach mal mit 100, 99, 0.9f aus.

    Beheben könnte man das indem man den Übertrag (total) auf die ganzen einzelnen Fraktale nochmals verteilt.


    Ehm, könntest du das nochmal etwas detailierter erklären ich weioß nicht genau wie du das meinst.
    Wie "nochmal verteilen" ?
    Ich versuche das gerade aber ich kapier nicht ganz was du meinst :D
    C# Developer
    Learning C++