zufallszahlen, höhere bevorzugen, aber nicht so krass

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Hallo zusammen,
ich möchte zufallszahlen erzeugen, mit Bevorzugung der höheren Werte-
Mir ist schon folgendes gelungen:

Code: Alles auswählen

#!/usr/bin/env python3
import random 
def linrandHigh(myMin,myMax,myCount):
    myErgebnis = myMin
    for i in range(1,myCount+1):
        myNum = random.uniform(myMin,myMax)
        if myNum >myErgebnis:
            myErgebnis = myNum
    return(myErgebnis)

for i in range(100):
    myzahl = linrandHigh(1,5,2)
    print(int(myzahl))
Das funktioniert soweit ganz gut, ich hätte nur gerne, dass auch die niedrigen Werte, also auch die 1 eine etwas größere Chance bekommen. Wie könnte ich das anstellen?
Wenn jemand eine Idee und einen Tipp hat, wäre ich sehr dankbar!
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

`my` ist immer ein unsinniges Präfix, wenn es nicht auch ein our-Präfix gibt.
Variablennamen schreibt man wie Funktionen komplett klein.
Benutze keine kryptischen Abkürzungen. Was ist ein linr? Und was bedeutet das `high`?
Von 0 bis count-1 zu gehen ist gleich wie von 1 bis count, nur dass zweiteres mehr Code ist, und damit schwieriger zu lesen.
`return` ist keine Funktion, die Klammern also überflüssig.

Code: Alles auswählen

def linr_and_high(min_value, max_value, count):
    return max(
        random.uniform(min_value, max_value)
        for _ in range(count)
    )
Warum soll gerade die 1 eine höhere Wahrscheinlichkeit haben? Wenn das min_value größer als 1 ist? Und was ist mit 1.000001?
Normalerweise hat man eine mathematische Funktion, die den uniformen Zahlenraum auf einen nicht-uniformen abbildet.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich könnte mir vorstellen, dass du hier
https://de.wikipedia.org/wiki/Wahrscheinlichkeitsmaß

und hier
https://docs.scipy.org/doc/scipy/reference/stats.html

Lösungen für dein Problem findest.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Hallo,
tut mir Leid, wenn die Variablen-Namen nicht so gut lesbar sind. Dass mit dem "my" mache ich, um globale und lokale Variablen nicht durcheinanderzubringen, habe ich mir so angewöhnt, die Großschreibung lässt Python zumindest zu. Klammern nach "return" werde ich in Zukunft lassen.
linrand steht für "linear random". Ansonsten funktioniert das Skript so: es produziert mehrere Zufallszahlen (so viele wie "count" und nimmt von all diesen die höchste. Selbst wenn "count" nur 2 ist, dann kommt die 1 sehr selten vor, ich möchte einfach, dass es öfter kommt. Ich suche so etwas wie eine gewichtete Wahrscheinlichkeit.
Vielleicht gibt es sogar eine built-in Funktion?
imonbln
User
Beiträge: 191
Registriert: Freitag 3. Dezember 2021, 17:07

blutigeranfaenger hat geschrieben: Donnerstag 17. Februar 2022, 21:50 Hallo zusammen,
ich möchte zufallszahlen erzeugen, mit Bevorzugung der höheren Werte-
Hierfür gibt es die random.triangular Funktion, mit dieser kannst du das relativ einfach machen, dass Werte in einem bestimmten Bereich bevorzugt werden zum Beispiel im höheren.

Code: Alles auswählen

import random
for _ in range(100):
      print(random.triangular(1, 10, 7))
Wenn auch am unteren Ende Werte bevorzugt werden sollen, wird das sowas wie eine Inverse Gaußfunktion werden. Das kann normales Python erstmal nicht, hier könnte die numpy.random.wald, dein Freund sein.
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Ok, random.wald werde ich mir anschauen, klingt ja fast romantisch!
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@blutigeranfaenger: Also ist das Problem grösser als `my`: Man braucht keine globalen Variablen von lokalen Unterscheiden weil man globale nicht verwendet. Das heisst an jedem Namen würde `my` stehen, was noch mal extra deutlich macht *wie* unsinnig dieser Präfix ist.

Das irgend etwas ”zugelassen” wird ist keine ausreichende Begründung. Die Naturgesetze (Python) lassen es zu das ich meinen Nachbarn umbringe. Die Gesellschaft (Konvention) findet das eher nicht so gut und es gibt Gesetze dagegen (Style Guide for Python Code).
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten