Wahrscheinlichkeit eines Ereignisses

  • Hey,

    normal hab ich bei creativen formeln kein problem aber das hier will irgentwie nicht^^

    also ich habe folgende werte gegeben:
    - Level des Spielers
    - min und max level der Tiere in der aktuellen Umgebung
    ich glaub die werte sollten ausreichen

    jetzt soll, die wahrscheinlichkeit, dass einem Tiere angreifen geringer werden, je höher das Level im verhältniss zu dem Level der Tiere steht.
    das selbe soll auch andersrum funktionieren, die wahrscheinlichkeit soll höher werden, wenn das level der Tiere höhe als das der Person ist

    wenn der Spieler jetzt Level 1 ist und die Tiere in der Umgebung von Lvl 6-7 sind, sollte es schon sehr wahrscheinlich sein, dass man angegriffen wird
    und wenn der Spieler Level 40 ist und die Tiere in der Umgebung von Lvl 6-9 sind, sollte es unwahrscheinlich (aber nicht ausgeschlossen!), dass man angegriffen wird.
    als beispiel nur^^

    die Abfrage dieser Funktion passiert bei jedem Schritt und es sollte jetzt nicht so sein, dass bei jedem Schritt auf einmal ein Gegner kommt nur weil die wahrscheinlichkeit sehr hoch ist

    ich hoffe ihr versteht was ich meine^^
    also wenn jemand eine Idee hat wäre ich sehr dankbar :)

    mfg

    Einmal editiert, zuletzt von Krabat (22. Juli 2012 um 12:10)

  • Da fehlen aber ein paar Informationen... In welcher Relation stehen die Level von Spieler und Gegner? Was ist das maximale Level? Da nicht bei jedem Schrit ein Gegner angreifen soll braucht man eine maximale Wahrscheinlichkeit, wie sollte die aussehen?

  • Da könnte vielleicht das Gaußverfahren anwendbar sein.http://de.wikipedia.org/wiki/Normalverteilung

    Es werden Zufallszahlen erstellt und es gibt selten große Ausreißer, welche du nicht haben möchtest.
    Demnach kannst du diese Zahl mit einer festen Konstante nochmals multiplizieren ( Level, Stärke, usw.) ,um immer andere Werte zu erhalten.
    Sieht aus als hätte sich damit schon jmd beschäftigt in AutoIt: hier

  • Ich würde es so lösen:

    Spoiler anzeigen
    [autoit]

    While 1
    $sMyLevel = InputBox("Level" ,"Gib deinen Level ein")
    If @error Then Exit
    $sEnemyLevel = InputBox("Level" ,"Gib den Level deines Gegners ein")
    If @error Then Exit
    if _checkIt(Int($sMyLevel),Int($sEnemyLevel)) Then
    $sMsg = "Angriff"
    Else
    $sMsg = "Glück gehabt"
    EndIf
    ConsoleWrite("Mein Level: " & $sMyLevel &@TAB & "Gegner: " & $sEnemyLevel & @TAB & $sMsg&@CRLF)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _checkIt($iMe,$iEnemy)
    Local $aCheck[$iMe+$iEnemy+1]
    $aCheck[0] =$iMe+$iEnemy
    for $i = 1 to $iMe
    $aCheck[$i] = 0
    Next
    for $i = $iMe + 1 to $aCheck[0]
    $aCheck[$i] = 1
    Next
    $i = $aCheck[Random(1,$aCheck[0],1)]
    Return $i
    EndFunc

    [/autoit]

    wenn es zu oft zum Angriff kommt kannst du dem eigenen Level notfalls einen kleinen Bonus auf addieren,

    mfg autoBert

  • so,
    danke für eure antworten :)

    autoBert: deine funktion ist prima
    habe gestern es selbst noch geschafft eine funktion zu schreiben, muss jetzt nur gucken ob deine evtl. besser ist :)

    [autoit]


    Func _Wahrscheinlichkeit($iLevel, $iTierLevel)
    If (Sqrt(Random()^2/Random()^2)*$iLevel) < (Sqrt(Random()^2/Random()^2)*$iTierLevel) Then Return True
    Return False
    EndFunc

    [/autoit]

    also, dass problem ist auf jedem fall gelöst :thumbup:

    mfg

    Einmal editiert, zuletzt von Krabat (22. Juli 2012 um 12:21)

  • autoBert: deine funktion ist prima

    danke dafür ist deine deutlich schneller bei hohen Leveln (50 + 50) 10 mal so schnell. Die Werte von folgendem Testskript:

    Spoiler anzeigen
    [autoit]

    Global $iAngriff, $iAngriff2
    For $iMe = 1 To 50
    For $iEnemy = 1 To 50
    $iAngriff = 0
    $iAngriff2 = 0
    $iStart = TimerInit()
    For $i = 1 To 1000
    If _checkIt($iMe, $iEnemy) Then $iAngriff += 1
    Next
    $iDiff = TimerDiff($iStart)
    $iStart = TimerInit()
    For $i = 1 To 1000
    If _Wahrscheinlichkeit($iMe, $iEnemy) Then $iAngriff2 += 1
    Next
    $iDiff2 = TimerDiff($iStart)
    ConsoleWrite("Mein Level: " & $iMe & @TAB & "Gegner: " & $iEnemy & @TAB & "CheckIt: " & $iAngriff & " / " & $iDiff & @TAB & @TAB & "Warscheinlichkeit: " & $iAngriff2 & " / " & $iDiff2 & @CRLF)
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func _checkIt($iMe, $iEnemy)
    Local $aCheck[$iMe + $iEnemy + 1]
    $aCheck[0] = $iMe + $iEnemy
    For $i = 1 To $iMe
    $aCheck[$i] = 0
    Next
    For $i = $iMe + 1 To $aCheck[0]
    $aCheck[$i] = 1
    Next
    $i = $aCheck[Random(1, $aCheck[0], 1)]
    Return $i
    EndFunc ;==>_checkIt

    [/autoit] [autoit][/autoit] [autoit]

    Func _Wahrscheinlichkeit($iLevel, $iTierLevel)
    If (Sqrt(Random() ^ 2 / Random() ^ 2) * $iLevel) < (Sqrt(Random() ^ 2 / Random() ^ 2) * $iTierLevel) Then Return True
    Return False
    EndFunc ;==>_Wahrscheinlichkeit

    [/autoit]

    zeigen dass die Tendenz zum Angriff bei beiden ~ gleich ist. Um es exakter zu vergleichen müsste man die Anzahl der Aufrufe deutlich erhöhen, dies will ich aber meinem schwachen Netbook nicht antun,

    mfg autoBert

  • jo, ich habe auch schon viele schleifen durchlaufen lassen um die funktionen zu vergleichen^^
    und den geschwindigkeitsunterschied hab ich auch bemerkt ;)
    zudem arbeiten die schon rellativ ähnlich, mit kleinen abweichungen durch random()

    ich werde wohl meine funktion nehmen :D

    mfg