Opetustv

DIA-pääsykokeen (28.5.13) "kadunylitystehtävä"

May 28th, 2013
171
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # DIPLOMI-INSINÖÖRI- JA ARKKITEHTIKOULUTUKSEN YHTEISVALINTA, 28.5.2013
  5. # (http://dia.fi/media/20742/insmat2013malli.pdf)
  6. #
  7. # Tehtävä: A6/B6/C6/D6 (Harri Potteri ylittää katua)
  8. #
  9. # Tehtävänanto kuului hiukan muokattuna ja yksinkertaistettuna näin:
  10. #                      Todennäköisyydellä 0,6 otetaan 60cm askel ja todennäköisyydellä 0,4 otetaan 30cm askel
  11. #                      (tosin tämä oli oikeasti muotoiltu 'viistoina' askelina, jotka vievät 30cm eteenpäin).
  12. #                      Millä todennäköisyydellä päästään tien toiselle puolelle (610cm) ottamatta 13. askelta?
  13. # Ohjelman selitys:    Suoritetaan 10 sarjaa 50000 toistolla kukin, katsotaan millä todennäköisyydellä kussakin
  14. #                      sarjassa edettiin vähintään 610cm ja lasketaan näin saaduista 10 tuloksesta keskiarvo.
  15. # Tulokset:            Tällä mallinnuksella tulokseksi saadaan suorituskerrasta riippuen noin 0,225 tai 0,226
  16. # Tulos laskemalla:    Binomitodennäköisyyttä hyödyntäen laskemalla saadaan neljällä desimaalilla 0,2253
  17. #                      (eli: p9 + p10 + p11 + p12, missä pk tarkoittaa MAOL-taulukon binomitodennäköisyyden
  18. #                      kaavaa; kaavassa n = 12 ja p = 0,6). Pidempiä askelia on oltava väh. 9, jotta päästään
  19. #                      kadun toiselle puolen.
  20. #
  21. # Author: janne.cederberg@opetus.tv
  22. # Date: 28.5.2013
  23. # Licence: Public domain
  24. # Disclaimer: Koodi on sikäli hiukan rumaa, että luo_askellus(...) mm. sisältää nuo rajat
  25. #             eikä rajoja pyydetä parametreina. Mut anyways, have fun :)
  26.  
  27. import random
  28.  
  29. def luo_askellus(askelia):
  30.   pituus = 0
  31.   for i in range(askelia):
  32.     if ( random.randint(1,10) <= 4 ):
  33.       pituus += 30
  34.     else:
  35.       pituus += 60
  36.   return pituus
  37.  
  38. def todnak_etta_askellus_yli(raja, askellus):
  39.   ylitykset = 0
  40.   for i in askellus:
  41.     if ( i >= raja ):
  42.       ylitykset += 1
  43.   return 1.0 * ylitykset / len(askellus)
  44.  
  45. def todnak_etta_n_toistolla_yli(raja, toistoja):
  46.   askellukset = []
  47.   for i in range(toistoja):
  48.     askellukset.append(luo_askellus(12))
  49.   return todnak_etta_askellus_yli(raja, askellukset)
  50.  
  51. def keskiarvo(lista):
  52.   return 1.0 * sum(lista) / len(lista)
  53.  
  54.  
  55. # MAIN
  56. if __name__ == "__main__":
  57.   koesarjoja = 10
  58.   todennakoisyydet = []
  59.  
  60.   for k in range(koesarjoja):
  61.     todennakoisyydet.append(todnak_etta_n_toistolla_yli(610, 50000))
  62.  
  63.   print keskiarvo(todennakoisyydet)
RAW Paste Data