Werteschwankung zwischen zwei Werten

  • C#

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Werteschwankung zwischen zwei Werten

    Hi,

    gleich vorweg: Im Prinzip ist es mir egal, ob die Lösung nun in C#, JS oder VB.NET ist. Ich poste es hier, weil ich C# bevorzuge, auch wenn ich es am Ende wohl in JS machen werde.

    Folgende Situation:
    Ich habe 2 Werte: a und b. A und b können unterschiedliche aber auch gleiche Werte haben. A und b haben eine art Position. A steht bei 1 und B bei 10 (zum Beispiel). Nun möchte ich den Raum zwischen den beiden Werten in einzelne Werte aufteilen. Also praktisch eine art Interpolation.
    Das möchte ich aber nicht Linear machen, sondern die Zahlen zwischen a und b sollen "zufällig" auf- und absteigen.
    Folgende Werte wären z. B. das, was ich erreichen möchte:
    Spoiler anzeigen

    Quellcode

    1. Pos. Wert Name
    2. 1 1 (a)
    3. 2 0.5
    4. 3 0.3
    5. 4 0
    6. 5 0.3
    7. 6 0.7
    8. 7 1.5
    9. 8 3.5
    10. 9 6
    11. 10 10 (b)

    Oder sowas:

    Quellcode

    1. Pos. Wert Name
    2. 1 1 (a)
    3. 2 2
    4. 3 2.3
    5. 4 4
    6. 5 4.6
    7. 6 5
    8. 7 7
    9. 8 6.4
    10. 9 8
    11. 10 10 (b)


    Man kann sich das als eine art Kurve vorstellen, die von einem Wert zum anderen "hinzittert". Das bedeutet die Werte dazwischen sind nicht zufällig, sondern entwickeln sich. Der "Abstand" von a und b ist aber nicht gleich der Differenz der Werte. Das heißt sowas wäre auch möglich:
    Spoiler anzeigen

    Quellcode

    1. Pos. Wert Name
    2. 1 9 (a)
    3. 2 9.2
    4. 3 9.1
    5. 4 9.0
    6. 5 8.9
    7. 6 8.95
    8. 7 9.0
    9. 8 9.5
    10. 9 9.7
    11. 10 10 (b)


    Es ist aber nicht unbedingt notwendig, dass bei mehrmaliger Durchführung der Rechnung immer die gleichen Werte rauskommen. Im Gegenteil: Ein bisschen Zufall wäre auch nicht schlecht. ;)

    Was ich bereits habe:
    Eine normale Interpolierung, die a und b wie eine Gerade verbindet (das ist ja geschenkt) und eine Sammlung an Funktionen, die den Zufall nur simulieren aber eigentlich vordefiniert sind (delegates werden per Zufall ausgewählt; die delagates führen die Interpolation nach einem Schema durch).

    Meine Frage:
    Wie realisiert man sowas am besten? Ich würde gerne auch sowas wie maximale Ausschlagsstärke oder eine Tendenz angebenkönnen, aber mit meinen aktuellen Methoden ist das leider nicht (gut/zufriedenstellend) möglich. Mein letzter richtiger Matheunterricht ist jetzt schon 3 Jahre her, von daher hoffe ich, dass mir hier ein paar Mathe-Begabte helfen können. :P
    Von meinem iPhone gesendet

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

    Hi,

    also die Methode, die ich hier im dreidimensionalen anwende, ist 1:1 auch auf den R² übertragbar^^ [Beta] Fractal Landscape - Ein Landschaftsgenerator

    Ich bin mir nicht genau sicher, was du willst, aber schaut man sich bei dir die Werte als Graph an, so ist das doch in etwa wie z.B. eine Aktienkurve. Genau das generiert auch der Midpoint-Replacement-Algorithmus, den ich dort verwende. Eine Tendenz kann auch durch den sog. Hurst-Exponenten angegeben werden.
    en.wikipedia.org/wiki/Perlin_noise könnte für Dich interessant sein.
    Du müsstest nur die "Nulllinie nach oben verschieben", also das Ganze linear interpolieren und den jeweiligen Perlin-Noise-Wert an der Stelle mit dem errechneten Linear-Wert addieren.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Mit den Stichwörtern von Quadsoft habe ich folgendes brauchbares finden können:
    gameprogrammer.com/fractal.html#midpoint
    avanderw.co.za/midpoint-displacement-in-one-dimension/
    gamedev.stackexchange.com/ques…oth-terrain-for-a-2d-game

    Mit dem ersten Link als Basis habe ich mal was hingeklatscht: pastebin.com/t0xTxAFT (die anderen beiden habe ich mir noch nicht groß angeschaut)

    Dieses Teil produziert für a=9 und b=10 ein optimales Ergebnis. Bei anderen Eingaben, die etwas weiter auseinander liegen, versagt diese Implementierung. Ich scheine irgendwo noch einen heftigen Logik- und/oder Implementierungsfehler zu haben. Ich sehe aber den Wald vor lauter Bäumen nicht mehr. Vielleicht fällt ja Euch etwas ins Auge.
    Von meinem iPhone gesendet
    Ich hatte noch einen alten Code , der mir aus gleichverteilten Zufallszahlen (random class) normalverteilte Zufallszahlen generieren sollte (-> Zwölferregel ).

    Wenn Du eine beliebige Funktion nimmst ( f(0)=a, f(10)=b), so müsstest Du die Abweichungen so erzeugen können (nicht gross getestet):

    "zufällige Abweichungen um eine gegebene Funktion"

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' delegates
    3. Delegate Function DistributionDelegate() As Double
    4. Delegate Function FunctionDelegate(ByVal x As Double) As Double
    5. ' delegate handlers
    6. Dim P As New DistributionDelegate(AddressOf UniformDeviation)
    7. 'Dim P As New DistributionDelegate(AddressOf GaussDeviation)
    8. Dim F As New FunctionDelegate(AddressOf MyFunction)
    9. ' other
    10. Dim spread As Double = 1 ' abweichungen sind im Interval [-1,+1]
    11. Dim r As New Random
    12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    13. For x As Integer = 0 To 10
    14. ' Funktionswerte für Zahlen 0..10: entspricht bei Dir a,b
    15. Dim y = F(x)
    16. ' zufällige Abweichung, zwichen 0 und 1
    17. Dim deviation As Double = P()
    18. ' neuer Y wert mit abweichung zwischen -1 und 1
    19. Dim ny = y + spread * deviation
    20. Log.Info("{0,5:N2} Deviation={1,5:N2}", ny, deviation)
    21. Next x
    22. ' oder einfacher mit LINQ
    23. 'Dim l = (From x In Enumerable.Range(0, 10) Select y = (F(x) + spread * P()))
    24. End Sub
    25. ' erzeugt gleichverteilte Zufallsvariable in [-1,1]
    26. Function UniformDeviation() As Double
    27. Return (r.NextDouble - 0.5) * 2
    28. End Function
    29. ' erzeugt normalverteilte Zufallsvariable in [-1,1] -> http://de.wikipedia.org/wiki/Zwölferregel
    30. Function GaussDeviation() As Double
    31. Dim x = (Enumerable.Sum(From a In Enumerable.Range(1, 12) Select r.NextDouble)) - 6
    32. Return (x / 12)
    33. End Function
    34. ' beschreibt die eigentliche, nicht randomisierte Funktion
    35. Function MyFunction(ByVal x As Double) As Double
    36. Return 0
    37. End Function
    38. End Class


    Die Funktion F gibt im Code immer 0 zurück, kann aber beliebig gewählt werden.
    Der Spread Faktor sorgt für die zulässigen Standardabweichungen, bei der Gaussverteilung würde ich den einiges höher als 1 setzen um grössere Ausschläge zu erzeugen.

    Ein Graph würde mich interessieren.

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