Wahlschätzungen

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Hallo,
gestern sah ich im Fernsehn wie Wahlschätzungen durchgeführt werden und warum sie so genau sind: Das Prinzip ist einfach:
Angenommen man hat 10000 Stimmen, so nimmt man nur 1000 von diesen 10000 und wertet diese dann aus. Je mehr man nimmt desto genauer ist die schätzung (ist ja logisch).
Das habe ich jetzt mal als kleines script umgesetzt (in from von farben):

Code: Alles auswählen

import random

colors = list()


def createColors():
	colors = list()
	for nothing in range(0, 1000000, 1):
		color = random.choice(["blue", "red", "yellow", "green"])
		colors.append(color)
	return colors



def int_to_procent(int_, maximum):
	x = ((100 * int_)/maximum)
	return x
    
    

def countColors():
    global colors
    blue = int()
    red = int()
    yellow = int()
    green = int()
    
    for color in colors:
        if color == "red":
            red += 1
        elif color == "blue":
            blue += 1
        elif color == "green":
            green += 1
        elif color == "yellow":
            yellow += 1

    return {
        "red": int_to_procent(red, 1000000),
        "blue": int_to_procent(blue, 1000000),
        "green": int_to_procent(green, 1000000),
        "yellow": int_to_procent(yellow, 1000000)
        }



def guessColors():
    global colors
    someColors = colors[0:1000]
    blue = int()
    red = int()
    yellow = int()
    green = int()
    
    for color in someColors:
        if color == "red":
            red += 1
        elif color == "blue":
            blue += 1
        elif color == "green":
            green += 1
        elif color == "yellow":
            yellow += 1

    return {
        "red": int_to_procent(red, 1000),
        "blue": int_to_procent(blue, 1000),
        "green": int_to_procent(green, 1000),
        "yellow": int_to_procent(yellow, 1000)
        }



print "Creating Colors...  ",
colors = createColors()
print "Created."
print "Guessing (with 1000 colors):\nRed: %s, Blue: %s, Green: %s, Yellow: %s" %(guessColors()["red"], guessColors()["blue"], guessColors()["green"], guessColors()["yellow"])
print "Counted Colors:\nRed: %s, Blue: %s, Green: %s, Yellow: %s" %(countColors()["red"], countColors()["blue"], countColors()["green"], countColors()["yellow"])
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo,

mal in der Reihenfolge, in der es mir aufgefallen ist:

Benutze keine globalen Variablen. Verwende Parameter und Rückgabewerte. Andernfalls sind deine Programme sehr fehleranfällig.

Nach PEP 8 sollte es "create_colors" und "count_colors" ... heißen.

range(0, x, 1) ist das selbe wie range(x).

Benutze Konstanten, andernfalls musst du an vielen Stellen im Programm Änderungen durchführen, wenn du etwas anpassen willst. Du benutzt zum Beispiel einige Male 1000000 oder die Farben. Wenn du die anpassen willst, dann musst du das an ca. 10000 Stellen machen. Mit Konstanten reicht eine Anpassung an genau einer Stelle.

"createColours" und "countColours" kannst du durch ein einfaches Dictionary ersetzen. Suche mal nach "defaultdict".

Es heißt "percent" nicht "procent". Außerdem wird das Ergebnis immer abgerundet, du solltest dort besser mit Floats rechnen. Das Zwischenspeichern in x ist auch unnötig, das Ergebnis kannst du gleich zurückgeben.

Zeilen 24 bis 27 sind mal sehr seltsam. Du solltest besser "blue=0" schreiben, "blue=int()" ist mir so wirklich noch nicht untergekommen.

Zeilen 29 bis 37 werden, wie oben schon gesagt, durch ein Dictionary überflüssig.

guessColors ist identisch zu countColors bis auf Zeile 50. Benutze Parameter. Wenn du Code kopierst/doppelt schreibst, solltest du anfangen nachzudenken ;-)

Die letzten beiden Zeilen sind viel zu lang. Maximal 79 Zeichen sollten benutzt werden.

Außerdem ist deine Wahl sehr langweilig. Alle Parteien sind gleich wahrscheinlich. Da musst du noch verschiedene Erwartungswerte einbringen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

danke für die Tipps.
Antworten