Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  11 2049
Hei!

Jeg fikk en idé i en utålelig kjedelig mattetime i går, og bestemte meg for å skrive et program som kastet terningene for meg ..vi har om sannsynlighetsregning. I 3. klasse.

Kode

import random
rollcount = 0
rollsum = 0
dice1 = 0
dice2 = 0
dice3 = 0
dice4 = 0
dice5 = 0
dice6 = 0
countto = input("How many dices do you want to throw? ")

while rollcount < countto:
    rollout = random.randint(1,6)
    if rollout == 1:
        dice1 = dice1 + 1
    elif rollout == 2:
        dice2 = dice2 + 1
    elif rollout == 3:
        dice3 = dice3 + 1
    elif rollout == 4:
        dice4 = dice4 + 1
    elif rollout == 5:
        dice5 = dice5 + 1
    elif rollout == 6:
        dice6 = dice6 + 1
    rollsum = rollsum + rollout
    rollcount = rollcount + 1

print "The average dice number of your", countto, "throws is", (rollsum * 1.00) / (rollcount * 1.00), ":)"
print "Of these throws, the following amount of each number presented themselves:\n"
print "Ones:  ", dice1, "times"
print "Twos:  ", dice2, "times"
print "Threes:", dice3, "times"
print "Fours: ", dice4, "times"
print "Fives: ", dice5, "times"
print "Sixes: ", dice6, "times"
Programmet funker som jeg vil, men jeg er jo i sandbox-læringsmodus enda! Er det noe ved koden jeg med fordel kunne gjort annerledes?
Sist endret av excubated; 6. januar 2011 kl. 07:07.
Mange måter å gjøre det på, men dette er jo litt mer kompakt

Kode

import random
rollcount = 0
rollsum = 0
dice = [0,0,0,0,0,0]
countto = input("How many dices do you want to throw? ")

while rollcount < countto:
	rollout = random.randint(1,6)
	dice[rollout-1] += 1
	rollsum += rollout
	rollcount += 1

print "The average dice number of your", countto, "throws is", (rollsum * 1.00) / (rollcount * 1.00), ":)"
print "Of these throws, the following amount of each number presented themselves:\n"
print "Ones:  ", dice[0], "times"
print "Twos:  ", dice[1], "times"
print "Threes:", dice[2], "times"
print "Fours: ", dice[3], "times"
print "Fives: ", dice[4], "times"
print "Sixes: ", dice[5], "times"
One of the good guys
2rs1's Avatar
uten å ha python for hånd, men dette bør funke.

Kode

import random
sum = 0
count = input("How many dices do you want to throw? ")
dice = [random.randint(1,6) for i in range(count)]
print "Avg. %.1d" % (float(sum(dice))/count)
for i in range(1,7):
    print "Number of %d: %d" % (i, dice.count(i))
Sitat av 2rs1 Vis innlegg
uten å ha python for hånd, men dette bør funke.

Kode

import random
sum = 0
count = input("How many dices do you want to throw? ")
dice = [random.randint(1,6) for i in range(count)]
print "Avg. %.1d" % (float(sum(dice))/count)
for i in range(1,7):
    print "Number of %d: %d" % (i, dice.count(i))
Vis hele sitatet...
åj. jeg har mye å lære.
One of the good guys
2rs1's Avatar
humm... "sum = 0" er bare unødvendig og føkker opp for sum()-funksjonen som brukes senere.
Sitat av 2rs1 Vis innlegg
humm... "sum = 0" er bare unødvendig og føkker opp for sum()-funksjonen som brukes senere.
Vis hele sitatet...
Ser ut som en fortgjort-feil, hvor sum skulle definere en ny variabel i stedet for å kalle en eksisterende funksjon.
Sist endret av excubated; 6. januar 2011 kl. 09:43.
Sitat av 2rs1 Vis innlegg
humm... "sum = 0" er bare unødvendig og føkker opp for sum()-funksjonen som brukes senere.
Vis hele sitatet...
Du treng heller ikkje float. Berre gjer:

Kode

1.0 * sum(dice) / count
Ein statistikkfunksjon er ganske lett. Noko alá:

Kode

from collections import defaultdict
num_to_words = { 1: "One", 2: "Two",  3: "Three",
                 4: "Four", 5: "Five", 6: "Six" } # . . .
d = defaultdict(int)
for m in dice:
    d[m] += 1
for x in d:
    print("%s %d%s!" % (num_to_words[d[x]], x, ("s" if d[x] > 1 else "")),
One 2! One 3! Two 4s! One 6! etc. Det blir sjølvsagt betre om du mekkar det i hop med talfunksjonen frå Euler 17, så har du nok tal til i minsto tusen eller meir.
Sitat av 2rs1 Vis innlegg
uten å ha python for hånd, men dette bør funke.

Kode

import random
sum = 0
count = input("How many dices do you want to throw? ")
dice = [random.randint(1,6) for i in range(count)]
print "Avg. %.1d" % (float(sum(dice))/count)
for i in range(1,7):
    print "Number of %d: %d" % (i, dice.count(i))
Vis hele sitatet...
Er det mulighet for en større utdypning i denne koden?

Sånn type, hvorfor in range(1,7) istedet for (1,6), jeg skjønner hvorfor, satt som et eksempel bare.
Sist endret av Pagliacci; 6. januar 2011 kl. 12:41.
range(1,6) vil gi listen [1,2,3,4,5] altså 1 til 6. (ikke til og med 6)
range(1,7) vil lage listen [1,2,3,4,5,6] som er alle muligheter for terningen.

Dette er noe jeg synes de burde fikset i python, da det er litt inkonsistent. I randint funksjonen er det randint(a,b) som returnerer er tall X gitt ved, a <= x <= b, mens range ikke tar med det siste tallet, noe jeg personlig hadde likt om den gjorde.
One of the good guys
2rs1's Avatar
Sitat av etse Vis innlegg
range(1,6) vil gi listen [1,2,3,4,5] altså 1 til 6. (ikke til og med 6)
range(1,7) vil lage listen [1,2,3,4,5,6] som er alle muligheter for terningen.

Dette er noe jeg synes de burde fikset i python, da det er litt inkonsistent. I randint funksjonen er det randint(a,b) som returnerer er tall X gitt ved, a <= x <= b, mens range ikke tar med det siste tallet, noe jeg personlig hadde likt om den gjorde.
Vis hele sitatet...
Den standard random-pakka i python er egentlig ikke noe å skryte av. Numpy har en mye bedre utgave. Denne følger standard python som er fra og med "low" og opp til "high" (ikke med). I tillegg så kan du definere størrelse, så du slipper å loope over. dice = numpy.random.randint(1,7,6), ville altså gitt deg [2, 3, 1, 5, 2, 6] (f.eks.) uten at du trengte å bruke list comprehension eller andre looper.

Sitat av Pagliacci Vis innlegg
Er det mulighet for en større utdypning i denne koden?

Sånn type, hvorfor in range(1,7) istedet for (1,6), jeg skjønner hvorfor, satt som et eksempel bare.
Vis hele sitatet...
print linja summerer opp tallene som er trukket og deler de på antall tall, for å få gjennomsnittet. printes ut med 1 desimal. Passer på å floate før jeg deler, slik at man unngår heltallsdivisjon. Kunne nok ganga med 1.0 eller plussa det på 0.0, men usikker på om dette har noe for seg bortsett fra å gjøre ting mer ulesbart.

i den siste loopen så går jeg igjennom tallene 1 til og med 6, printer ut teksten, hvilket tall jeg er på og hvor mange ganger tallet finnes i lista (listenavn.count(det du leter etter)).
Sist endret av 2rs1; 6. januar 2011 kl. 14:26.
Sitat av Pagliacci Vis innlegg
Er det mulighet for en større utdypning i denne koden?

Sånn type, hvorfor in range(1,7) istedet for (1,6), jeg skjønner hvorfor, satt som et eksempel bare.
Vis hele sitatet...

Kode

import random //importerer modulen random
count = input("How many dices do you want to throw? ") // stiller spm til bruker, antall terninger
dice = [random.randint(1,6) for i in range(count)] //lager en matrise med terningkastene, for antall terninger
print "Avg. %.1d" % (float(sum(dice))/count) //printer ut gjennomsnittet av kastene
for i in range(1,7): //kjører kode for alle tallene 1 2 3 4 5 6
    print "Number of %d: %d" % (i, dice.count(i))//printer ut eks: "Number of 2: 32" hvis i = 2 og det var 32 2ere i terningkastmatrisen dice
EDIT: Valgte å kutte ut variabelen sum, fordi det ikke ble brukt i koden.
Sist endret av Jannis!; 6. januar 2011 kl. 14:29.
Den standard random-pakka i python er egentlig ikke noe å skryte av
Vis hele sitatet...
Det blir feil og si det sånn,den er bra selv om numpy har flere funksjoner bruker begge Mersenne twister
Mersenne twister er kjent som kjent som en god generator for mange applikasjoner.
Brukes av Matlab,R,Maple,Ruby..o.s.v.
Les mere om det her random module

Kunne nok ganga med 1.0 eller plussa det på 0.0, men usikker på om dette har noe for seg bortsett fra å gjøre ting mer ulesbart.
Vis hele sitatet...
Det har ingen ting for seg når det er snakk om terninger som aldrig skal ha en float output.
from __future__ import division som første line i python 2.x versjoner løser dette med integer divsion.

Kode

*** Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32. ***
>>> 1 / 3
0
>>> from __future__ import division
>>> 1 / 3
0.3333333333333333
>>> 1.0 / 3  #1.0 make it float and divison vill work
0.3333333333333333
>>>
Jannis bare noen rettelser på kommentering din.
Husk python bruker # og ikke // for kommentering av kode.
dice = [random.randint(1,6) for i in range(count)] #list comprehension her lager en "list" ikke en matrise.

Kode

>>> l =[random.randint(1,6) for i in range(3)]
>>> l
[5, 2, 2]

#Lage en matrise
>>> matrise = [range(3) for y in range(3)]
>>> matrise
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
>>>
Sist endret av snippsat; 6. januar 2011 kl. 19:55.