[Python] Variabele wordt niet opgehoogd

Pagina: 1
Acties:
  • 227 views sinds 30-01-2008
  • Reageer

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Hey :)

Ik had een simulatiescriptje geschreven over flippo's. Het gaat erom hoeveel zakken chips je moet kopen om een bepaalde flippo verzameling te completeren..

Nu heb ik deze code al geschreven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding: cp1252 -*-
import random
totaal  = 0.0
maximum = 1000
count   = 0.0
container   = []
aantalflippos       = input("Hoeveel verschillende flippo's zijn er?: ")
flippoarray         = []
blaat               = 0
while blaat < aantalflippos:
    flippoarray[:blaat]   = flippoarray + [0]
    blaat                 = blaat + 1
standaardlist = flippoarray
aantalflippos = aantalflippos - 1
while totaal < maximum:
        totaal      = totaal + 1
        flippoarray = standaardlist
        while not sum(flippoarray) is len(flippoarray):
                count                   = count + 1
                num             = random.randint(0,aantalflippos)
                schaap                  = num + 1
                flippoarray[num:schaap] = [1]
                print flippoarray


print count
print totaal
uitkomst    = count/totaal
aantalflippos   =   aantalflippos + 1
print "Gemiddeld aantal zakken chips kopen om verzameling van" , aantalflippos , "flippo's compleet te krijgen is:", uitkomst


Het is gefixed, andere vraag: Op welke plaatsen kan ik mijn script optimilaliseren? (Hoe probeer ik dan zelf wel uit te vogelen :) )

[ Voor 221% gewijzigd door Enfer op 10-01-2006 21:15 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Wat bedoel je met de "waarde van de laatste simulatie"?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Dat is de waarde wie count heeft na het laatste keer draaien van deze while loop:
code:
1
2
3
4
5
6
while not sum(flippoarray) is len(flippoarray):
                count                   = count + 1
                num             = random.randint(0,aantalflippos)
                schaap                  = num + 1
                flippoarray[num:schaap]    = [1]
                print flippoarray

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Dat is toch ook wat je wil? Count wordt elke iteratie met 1 opgehoogd, en aan het einde heb je het aantal keer dat die loop is uitgevoerd in die variabele count staan? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Het gaat erom dat count de waarde behoud na elke loop, en dat hij dus met die waarde verdergaat...
Totaal is ervoor om het aantal keer dat de totale loop is uitgevoerd bij te houden...

[ Voor 31% gewijzigd door Enfer op 09-01-2006 15:16 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Problem? schreef op maandag 09 januari 2006 @ 15:16:
Het gaat erom dat count de waarde behoud na elke loop, en dat hij dus met die waarde verdergaat...
Dat doet hij toch ook? :? Stel, de buitenste loop wordt 5x uitgevoerd, en de binnenste ook (wat dus betekent dat deze 5x5 keer word uitgevoerd), dan heeft totaal de waarde 5 en count de waarde 25. Dat klopt dan toch ook? Welke waarde wil jij dan hebben?

[ Voor 7% gewijzigd door NMe op 09-01-2006 15:19 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Die waarde!
Dit is juist het probleem.. We krijgen de waarde van de laaste keer dat de binnenste while loop doorgegaan word. Dus bijvoorbeeld 5... Terwijl het dus minimaal 25 zou moeten zijn....

Dit is de uitkomst bij 5 aantal flippo's

code:
1
2
3
4
5
6
7
8
9
10
11
12
Hoeveel verschillende flippo's zijn er?: 5
[0, 1, 0, 0, 0]
[0, 1, 0, 1, 0]
[0, 1, 0, 1, 0]
[0, 1, 0, 1, 1]
[0, 1, 0, 1, 1]
[0, 1, 1, 1, 1]
[0, 1, 1, 1, 1]
[1, 1, 1, 1, 1]
8.0 (Dit is dus Count)
1000.0
Gemiddeld aantal zakken chips kopen om verzameling van 5 flippo's compleet te krijgen is: 0.008

[ Voor 55% gewijzigd door Enfer op 09-01-2006 15:51 . Reden: Simulatie erbijgezet ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Niet gehinderd door enige python-kennis, maar initialiseer count eens op 0 ipv op 0.0 ?
Wellicht dat hij binnen de scope van de laatste loop denkt dat het een andere variabele is, want geen floating point maar integer.
[/niet-gehinderd] ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Nee werkt niet ;) Hij komt nog steeds veels te laag uit ;)

[ Voor 7% gewijzigd door Enfer op 09-01-2006 15:32 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Zo op het eerste oog lijkt het erop dat de twee while lussen achter elkaar worden uitgevoerd, ipv genest.
Dit kun je bepalen door in beide lussen een print statement op te nemen.

Ook ik wordt niet gehinderd door enige kennis van Python en ik (als Java en C# programmeur) vind een taal erg ranzig die niet gewoon een markering gebruikt voor het begin en het einde van een lus blok. Goed, het bespaart je een regeltje code, maar de leestbaarheid is ook naar de maan.

Anyhow, zou het gebruik van een TAB ipv spaties of vice versa misschien het probleem kunnen veroorzaken?

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Inderdaad ja, die indent op regel 18 is minder dan die op regels 16 en 17 ...

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Nope, ook hier ligt het niet aan... Ik heb alles ff opnieuw getabbed, maar er komt nog steeds een verkeerde uitkomst uit (nog steeds te laag).. En de while loops staan wel goed, opmaak is hier alleen niet zo super...

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als ik kijk naar de output van je simulatie, dan wordt de binnenste loop maar 1x uitgevoerd. Komt het dan misschien omdat je regel 17 eigenlijk als laatste van je binnenste while loop zou moeten uitvoeren? nevermind, te weinig geslapen ;)

[ Voor 9% gewijzigd door bigbeng op 09-01-2006 15:57 ]


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Ik wou net zeggen, de Python interpreter is nogal gevoelig voor indentatie, en het feit dat de tweede while niet vanaf dezelfde kolom begint als die assignments in de eerste while lijkt me dan ook een vrij slecht teken. ;)

spuuuit

[ Voor 11% gewijzigd door DroogKloot op 09-01-2006 16:03 ]


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Nope, ook dit werkt niet, omdat hij de while loop de heletijd op een lege list met nullen zet..

Hmmm, ik zie dus net dat als ik doe:
code:
1
print standaardlist


dit eruit komt
code:
1
[1, 1, 1, 1, 1]

Waar dat nou weer op mag slaan? 8)7 Voor zover ik weet moet standaardlist een list met allemaal nullen blijven :/

[ Voor 58% gewijzigd door Enfer op 09-01-2006 16:18 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik zou gokken dat Python arrays als reference types hanteert, niet als value types. Dus de twee variabelen wijzen naar dezelfde array in het geheugen.

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Standaardlist bevat nog steeds een aantal enen, ipv nullen na deze toevoeging:
code:
1
2
3
4
5
boeiend             = 0

while boeiend < aantalflippos:
    standaardlist[:boeiend]   = standaardlist + [0]
    boeiend                 = boeiend + 1


Dus daar lijkt me het probleem ook niet in te zitten?

[ Voor 5% gewijzigd door Enfer op 09-01-2006 16:28 ]


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Waarschijnlijk is de variabele standaardlist de boosdoener.. Maar ik snap niet hoe het komt dat die aan het eind allemaal enen bevat, terwijl er niets mee gebeurt... en hij word in het begin gevuld met nullen...

Heeft iemand een idee?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik schrijf het toch niet voor niets?
bigbeng schreef op maandag 09 januari 2006 @ 16:16:
Ik zou gokken dat Python arrays als reference types hanteert, niet als value types. Dus de twee variabelen wijzen naar dezelfde array in het geheugen.

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Ik dacht dat ik dat gefixed had door standaardlist helemaal opnieuw te genereren, en nergens anders voor te gebruiken? Of heb ik het mis?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -*- coding: cp1252 -*-
import random
totaal      = 0.0
maximum     = 1000
count       = 0
container   = []
aantalflippos       = input("Hoeveel verschillende flippo's zijn er?: ")
flippoarray         = []
standaardlist       = []
blaat               = 0
boeiend             = 0   
while blaat < aantalflippos:
    flippoarray[:blaat]   = flippoarray + [0]
    blaat                 = blaat + 1

while boeiend < aantalflippos:
    standaardlist[:boeiend]   = standaardlist + [0]
    boeiend                 = boeiend + 1
aantalflippos = aantalflippos- 1
while totaal < maximum:
    totaal        = totaal + 1
    while not sum(flippoarray) is len(flippoarray):
        count                   = count + 1
        num             = random.randint(0,aantalflippos)
        schaap                  = num + 1
        flippoarray[num:schaap]    = [1]
        print flippoarray
        flippoarray = standaardlist
print count
print totaal
print standaardlist
uitkomst    = count/totaal
aantalflippos   =   aantalflippos + 1
print "Gemiddeld aantal zakken chips kopen om verzameling van" , aantalflippos , "flippo's compleet te krijgen is:", uitkomst


Nieuwe code, voor de duidelijkheid

[ Voor 88% gewijzigd door Enfer op 10-01-2006 17:50 . Reden: Nieuwe code geadd ]


Verwijderd

Een paar dingen die me zomaar opvallen aan je code:
Python:
1
2
3
while blaat < aantalflippos:
    flippoarray[:blaat]   = flippoarray + [0]
    blaat                 = blaat + 1

In Python doe we dat zo:
Python:
1
flippoarray = [0] * aantalflippos

Python:
1
2
3
while boeiend < aantalflippos:
    standaardlist[:boeiend]   = standaardlist + [0]
    boeiend                 = boeiend + 1

wordt:
Python:
1
2
for boeiend in range(aantalflippos):
    standaardlist.append(0)

Ik ga er trouwens vanuit dat regel 19 en 20 verkeerd geïndenteerd zijn. Klopt dat? Anders begrijp ik er helemaal niks van.
Wat je precies wil bereiken is me niet helemaal duidelijk (je variabelnamen lijden ook nogal af). Feit is wel, zoals bigbeng al vermoedde, dat flippoarray en standardlist dezelfde variabele zijn (ze worden geassigned by reference). Wil je een list (een array is wat anders in Python) kopiëren, dan doe je zo:
Python:
1
nieuwelist = oudelist[:]

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
hehe , ik was qua variabele namen even inspiratieloos.. Wat mijn doel precies is is dus dit:
Simulatie maken van een "Collectors-problem"
Je hebt bijvoorbeeld 6 flippo's in zakken chips zitten...
Hoeveel zakken chips moet ik kopen om alle 6 de flippo's in mijn bezit te krijgen?

Nu is het me dus zo gelukt, (ff de versie met compleet uitgelegd)
Let niet op de php syntax highlighting, maar zo lijkt het me net iets duidelijker dan gewoon zwart:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: cp1252 -*-

import random               # Random functie importeren om random getal te kunnen genereren
totaal              = 0.0   # Totaal aantal keren dat de iteratie gedraaid is
maximum             = 1000  # Maximaal aantal keren dat de iteratie gedraaid mag worden
count               = 0     # Totaal aantal keren dat je in de gehele simulatie een flippo pakt
aantalflippos       = input("Hoeveel verschillende flippo's zijn er?: ")    # Vragen voor input van gebruiker over aantal flippo's
flippowaarden       = [0] * aantalflippos   # Een lege list maken waarin aantal malen nul komt te staan (Voor elke flippo 1 nul)
standaardlist       = flippowaarden[:]  # Een lege lijst maken wie leeg blijft, zodat bij opnieuw draaien van iteratie weer met een list bevattend 0-en kan begonnen worden
aantalflippos       = aantalflippos- 1  # Het aantal flippo's met 1 verlagen, omdat je in een list op plek 0 in plaats van 1 begint
while totaal < maximum:                 # Zolang de functie niet zo vaak gedraaid heeft als in maximum is aangegeven verder gaan
    totaal          = totaal + 1        # Totaal aantal keren dat de functie gedraaid heeft met 1 verhogen
    flippowaarden   = standaardlist[:]  # De flippolijst naar beginwaarden (0-en) terugzetten
    while not sum(flippowaarden) is len(flippowaarden): # Zolang de flippolijst niet allemaal 1-en bevat (len is de lengte van de list, als alle waarden 1 zijn is de lengte ook de som van de list)
        count                               = count + 1 # Totaal aantal keren dat je in de gehele simulatie een flippo pakt met 1 ophogen
        flippo                              = random.randint(0,aantalflippos)   # Een random getal genereren, wat een bepaalde flippo voor moet stellen
        flippoplaats                        = flippo + 1                        # Flipponummer + 1 doen, zodat hij op de goede plek in de lijst komt (namelijk de plek van zijn eigen nummer)
        flippowaarden[flippo:flippoplaats]  = [1]                               # Flippowaarde van 0 naar 1 zetten op de goede plaats
uitkomst            = count/totaal              # Uitkomst berekenen, totaal aantal gepakte flippos delen door totaal aantal keren dat de simulatie is gedraaid
aantalflippos       = aantalflippos + 1         # Aantal flippos weer met 1 verhogen, omdat in het begin van de functie met 1 verlaagd is
print "Gemiddeld aantal zakken chips kopen om verzameling van" , aantalflippos , "flippo's compleet te krijgen is:", uitkomst
# Uitkomst outputten

De indents kunnen iets afwijken in deze code, komt omdat de layout niet zo super overkomt
Hardstikke bedankt aan iedereen wie me geholpen heeft, maar vooral dank aan: JRR _/-\o_

Even nog wel een vraagje: kan ik nog iets optimaliseren aan deze code? en zoja wat? (hoe probeer ik dan wel zelf uit te vogelen)

[ Voor 120% gewijzigd door Enfer op 10-01-2006 20:53 . Reden: Oplossing :D ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
volgens mij is regel 14 iets te optimaliseren door:
PHP:
1
while not sum(flippoarray) is aantalflippos+1:

Ik weet natuurlijk niet hoeveel processor cycles het kost om die len te bepalen, maar van een geheugenreferentie naar iets wat een getal voorstelt mag je ervan uitgaan dat het maar 1 cycle in beslag neemt. Geen idee of dit de performance beinvloed, maar ik dacht kom, dat laat ik jou lekker uitvogelen ;)

edit:
getver, je verlaagt aantalflippos met 1 om als grens voor random te gebruiken, dat zag ik net pas :P

[ Voor 13% gewijzigd door bigbeng op 10-01-2006 21:25 ]


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-04 15:19
Hey, dat ziet er inderdaag beter uit qua performance :) Tnx.. ik neem aan dat dat wel sneller is dan de len() te bepalen (hoewel het niet zo heel veel zal schelen denk ik.. ;) )

@ Hieronder:
Dat had ik niet echt verwacht.. maarja, alle kleine beetjes helpen zeg ik maar :)

[ Voor 22% gewijzigd door Enfer op 10-01-2006 21:42 ]


Verwijderd

Het is alleen al sneller omdat len geen lokaal object is, en aantalflippos wel.aantalflippos wordt dus een stap eerder gevonden dan len. Niet dat je dat gaat merken hoor ;)
Pagina: 1