Liste mit prozentualen Anteil von Zufallszahlen erstellen

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
Mar93
User
Beiträge: 5
Registriert: Mittwoch 7. März 2018, 15:00

Hallo Community,

ich bin gerade dabei mich in Python einzuarbeiten und befasse mich mit Wahrscheinlichkeiten etc. Ich möchte folgendes realisieren, finde jedoch
nicht die "passende" Funktion dazu bzw. weiß garnicht ob das möglich ist.

Ich möchte eine Liste mit n Elementen (z.B. 10). Darin sollen die Zahlen 1 und 2 zufällig drinnen sein. Zudem soll ein gewisser prozentualer Anteil Nullen darin befinden.
Das Ergebnis soll dann so aussehen (bei 20 % Nullen): Liste = [0,1,1,1,2,2,1,1,0,2] ==> 2 Nullen => 20 %

Ich habe es bisher soweit geschafft:

Liste = []
for i in range(10):
A = random.randint(1,2)
Liste.append(A)

Jedoch habe ich probleme, dass 20 % davon NULLEN sein sollen. Unterstützt die Randomfunktion sowas zufällig?
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Kannst du nicht einfach zufällig einige Elemente überschreiben, nämlich genauso viel wie gefordert sind.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Mar93
User
Beiträge: 5
Registriert: Mittwoch 7. März 2018, 15:00

Das ist schonmal ein Ansatz. ich setze mich sofort ran =)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Mar93: Du baust Deine Liste sortiert auf. Erst so viele Nullen, wie Du möchtest, dann würfelst Du, wie viele Einsen und füllst den Rest mit Zweien. Danach shufflest Du die Liste.
Mar93
User
Beiträge: 5
Registriert: Mittwoch 7. März 2018, 15:00

Ich habe jetzt eine Liste mit Zufallszahlen (bei 20 % sind es 2 Zahlen), welche die auszutauschenden Elemente darstellt.
Z.B. Austausch = [1,5] => jetzt können die Elemente 1 und 5 mit NULLEN besetzt werden.

Jedoch kann es jetzt vorkommen, dass Werte doppelt/dreifach auftauchen und so sind die 20 % nicht eingehalten. Z.B Austausch = [5,5]. Wenn dann nur das 5. Elemnt ausgetauscht wird, sind es am Ende ja nur 10 % die ersetzt wurden.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich würde folgenden Ansatz wählen:

Code: Alles auswählen

def get_random_numbers_with_zeros(number_of_elements, number_of_zeros):
    data = []
    for _ in range(number_of_elements):
        data.append(random.randint(1, 2))
    for index in range(number_of_zeros):
        data[index] = 0
    random.shuffle(data)
    return data
Zuerst wird eine Liste aufgebaut die nur 1 und 2 als zufällige Elemente hat. Anschließend werden die ersten number_of_zeros Elemente mit 0 überschrieben. Dann wird die Liste noch einmal gemischt. Fertig.

Wenn man den Aufbau der Liste mit einer list comprehension durchführt, dann bekommt man Folgendes

Code: Alles auswählen

def get_random_numbers_with_zeros(number_of_elements, number_of_zeros):
    data = [random.randint(1, 2) for _ in range(number_of_elements)]
    for index in range(number_of_zeros):
        data[index] = 0
    random.shuffle(data)
    return data
Und jetzt kann man das Einfügen der 0 auch noch in die list comprehension verlagern

Code: Alles auswählen

def get_random_numbers_with_zeros(number_of_elements, number_of_zeros):
    data = [random.randint(1, 2) if index >= number_of_zeros else 0 for index in range(number_of_elements)]
    random.shuffle(data)
    return data
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn hier schon Lösungen zu Hausaufgaben präsentiert werden:

Code: Alles auswählen

def get_random_numbers_with_zeros(number_of_elements, number_of_zeros):
    number_of_ones = random.randrange(number_of_elements - number_of_zeros + 1)
    number_of_twos = number_of_elements - number_of_zeros - number_of_ones
    data = [0] * number_of_zeros + [1] * number_of_ones + [2] * number_of_twos
    random.shuffle(data)
    return data
Mar93
User
Beiträge: 5
Registriert: Mittwoch 7. März 2018, 15:00

Vielen Dank für die Ansätze. Ich kann euch aber beruhigen. Es sind keine Hausaufgaben. Vielmehr ist es mein eigenes kleines Projekt, welches ich realisieren möchte. Ich bin gerade dabei einen Raspberry PI zu programmieren :D
Mar93
User
Beiträge: 5
Registriert: Mittwoch 7. März 2018, 15:00

Ich habe es jetzt folgendermaßen gelöst:

1) Liste mit n Random-zahlen erstellen
2) Benötigte Anzahl von Nullen einfügen in die Liste
3) Random-Shuffle damit die Nullen schön eingemischt werden

Code: Alles auswählen

n = 10
RANDOM_LIST = []
PROZENT = 0.2
# Erzeugung von Random-Nummern von 1-4
for i in range(n):
    A = random.randint(1,4)
    RANDOM_LIST.append(A)
    
# Anzahl Nullen bestimmen
AnzNUllen = n * PROZENT
AnzNUllen = int (AnzNUllen)

# Nullen in die Liste einmischen
for i in range(AnzNUllen):
     RANDOM_LIST[i] = 0

# Zufällig mischen
random.shuffle(Ergebnisliste)

Es ist zwar nicht Profi-Like, reicht aber für mein Vorhaben aus =) :o
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Mar93: Du solltest dringend etwas an Deiner Groß-Klein-Schreibung verbessern. `AnzNUllen` ist unlesbar. Generell werden in Python alle Variablen klein_mit_unterstrich geschrieben.
Antworten