Anzahl der doppelten Zahlen ausgeben

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
Mueller.D
User
Beiträge: 33
Registriert: Freitag 13. Januar 2017, 10:04

Hallo, ich bin absoluter Neuling und benötige Hilfe.

Ich hab das Programm schon fast fertig, mir fehlt nur noch die Anzahl.

Bsp.
Ausgabe: 3 3 4 5
Dann soll als Antwort kommen: Die 3 kommt 2 mal vor.
Wie kommt man auf die 2?

Ich bin dankbar für eure Hilfe.
PS: Mir fehlt der Code unten bei #Anzahl berechnen

Mein Code:

Code: Alles auswählen

from random import randint
import numpy as np

eingabe1 = int(input("Bitte die Häufigkeit eingeben: "))
eingabe2 = int(input("Soll Ihr Würfel 4, 6, oder 12 Seitig sein(Eingabe: 4, 6, 12)?  "))

i = 0

while i < eingabe1:
    if eingabe2 == 4:
        w1 = randint(1, 4)
        w2 = randint(1, 4)
    elif eingabe2 == 6:
        w1 = randint(1, 6)
        w2 = randint(1, 6)
    elif eingabe2 == 12:
        w1 = randint(1, 12)
        w2 = randint(1, 12)
        
    erg = w1 + w2
    i+=1
    print(erg)
    
summe = np.array(erg)

#Anzahl berechnen

print(summe, 'wurde (mit) am häufigsten gewürfelt mit ',anzahl, ' mal.')
Zuletzt geändert von Anonymous am Freitag 13. Januar 2017, 12:23, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Dein Code ist .. achwas schreib ich dir ihn mal neu, incl der gesuchten Lösung.
Ich habe auch deinen Numpy Import rausgeworfen, für das Bilden von Summen über Würfelaugen braucht es keine Highspeed Implementierung der Summenfunktion...

Code: Alles auswählen

# -*- coding: utf-8 -*-

# gibt ein zufaelliges Element einer Liste zurück.
from random import choice
from collections import Counter

n_wuerfel = int(input("Bitte die Häufigkeit eingeben: "))
n_wuerfelseiten = int(input("Soll Ihr Würfel 4, 6, oder 12 Seitig sein(Eingabe: 4, 6, 12)? "))

# Stelle sicher das die Eingabe Richtig ist, ansonnsten werfe eine AssertionError Exception.
assert n_wuerfelseiten in [4,6,12], "Verdammt ich sagte 4,6,12 Seiten, nicht %s" % n_wuerfelseiten

# Erstelle Liste aller Augenwerte des Würfels
wuerfelseiten = list(range(1,n_wuerfelseiten+1))

# Erstelle Liste mit Elementen aus jeweils einer zufällig gewählten(choice) Würfelseite pro Würfel.
ergebnisse = [ choice( wuerfelseiten ) for wuerfel in range(n_wuerfel)  ]

print("Es wurden die Augen %s gewürfelt." % ergebnisse)
print("Die Summe der gewürfelt Augen ist %s" % sum(ergebnisse))

#  Für Counter siehe: https://docs.python.org/2/library/colle ... ns.Counter
for augen, anzahl in Counter(ergebnisse).most_common():
    print ("Die Zahl {zahl} wurde {haeufigkeit} gewürfelt".format(zahl=augen,haeufigkeit=anzahl))

Fragen sind erlaubt.
BlackJack

@Mueller.D: Der gezeigte Code kann nicht '3 3 4 5' als Ausgabe haben. Der gibt das Ergebnis jedes Wurfes einfach nur aus. Ein Ergebnis pro Zeile.

Wenn Du am Ende wissen willst wie oft welche Augenzahl ausgewürfelt wurde, dann musst Du das zählen. Entweder schon beim Auswürfeln, oder Du musst Dir alle Ergebnisse merken und dann am Ende auszählen. In `collections` gibt es das den hilfreichen `Counter`.

Anmerkungen zum Quelltext: Namen sollte man nicht durchnummerieren. Das ist entweder ein Zeichen das man eigentlich keine Einzelnamen sondern eine Datenstruktur verwenden will, meistens eine Liste, oder das man sich keine Gedanken um einen sinnvollen Namen gemacht hat. Was wiederum darauf hinweisen kann dass man das Problem oder die Lösung nicht so ganz verstanden hat, falls man sich Gedanken gemacht hat, aber keinen sinnvollen Namen für einen Wert finden konnte. Denn dann hat man offensichtlich Probleme das Problem oder die Lösung zu erklären. Sinnvolle Namen sind also nicht nur ”Kosmetik” sondern wichtiger Bestandteil beim Programmieren.

Anstelle der ``while``-Schleife würde man eine ``for``-Schleife verwenden.

Die Tests auf den Wert von `eingabe1` erfolgen immer auf den Wert der dann im jeweiligen Zweig auch verwendet wird und alle Zweige sind bis auf diese Wert gleich. Das ist viel unnötiger Code, wo einfach diese Zeile reichen würde: ``erg = sum(randint(1, eingabe2) for _ in range(2))``. Hier noch mit zwei schlechten Namen. `eingabe2` weil der Name dem Leser nicht verrät was der Wert *bedeutet* und `erg` weil es eine kryptische Abkürzung ist. `ergebnis` wäre deutlicher. Es ist ja nicht mehr so als das man beim Quelltext jedes Byte Speicher sparen müsste oder das Programmiersprachen nur wenige Zeichen pro Bezeichner tatsächlich verwenden würden. Quelltext ist zum Lesen für Menschen gedacht und sollte dementsprechend geschrieben werden — möglichst leicht verständlich für Menschen.

Was hast Du Dir dabei gedacht den skalaren Wert `erg` in ein Numpy-Array zu verpacken? Das macht wenig bis gar keinen Sinn.

@pyHoax: `random.choice()` kommt auch mit `range()`-Objekten klar (`xrange()` in Python 2), das muss man nicht in eine Liste umwandeln. Ist bei maximal 12 Seiten jetzt nicht wirklich ein Speicherproblem, aber ich wollt's trotzdem mal erwähnen. :-) Wobei ich `randint()` trotzdem vorziehen würde.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

BlackJack hat geschrieben: @pyHoax: `random.choice()` kommt auch mit `range()`-Objekten klar (`xrange()` in Python 2), das muss man nicht in eine Liste umwandeln. Ist bei maximal 12 Seiten jetzt nicht wirklich ein Speicherproblem, aber ich wollt's trotzdem mal erwähnen. :-) Wobei ich `randint()` trotzdem vorziehen würde.
Weis ich doch.
Aber ich fand in diesem Fall (weil ich choise und nicht randint verwendet habe) war die Zeile nötig um ein Kommentar hinzuzufügen (und um mit print mal auszugeben ob das passiert was ich wollte)
Mueller.D
User
Beiträge: 33
Registriert: Freitag 13. Januar 2017, 10:04

Danke, hat mir weiter geholfen :)
Antworten