simple-markov.scm 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. ;; Copying and distribution of this file, with or without
  2. ;; modification, are permitted in any medium without royalty provided
  3. ;; the copyright notice and this notice are preserved. This file is
  4. ;; offered as-is, without any warranty.
  5. ;;; Dit programma simuleert de simpele Markovketen voor namen met de
  6. ;;; 'e' en 'n' die als voorbeeld wordt gebruikt in het verslag. Elke
  7. ;;; staat wordt gesimuleerd door een functie die de desbetreffende
  8. ;;; letter print en daarna gebaseerd op kans verder gaat naar de
  9. ;;; volgende staat.
  10. ;;;
  11. ;;; Dit programma is geschreven in Scheme, omdat dat een handige taal
  12. ;;; is om snel en elegant een prototype in uit te drukken. Alles wat
  13. ;;; na een ; komt is in Scheme een commentaar en wordt dus niet door
  14. ;;; gebruikt tijdens het uitvoeren van het programma. De functie
  15. ;;; random:uniform wordt gebruikt om een willekeurig nummer tussen de
  16. ;;; 0 en 1 te krijgen. De functie display drukt de gegeven letter af
  17. ;;; en newline eindigt de line, ongeveer hetzelfde alsof je enter
  18. ;;; indrukt op je toetsenbord.
  19. ;;; De BEGIN toestand (dit kon niet begin worden genoemd omdat dat zou
  20. ;;; conflicteren met een naam die al in Scheme voorkomt)
  21. (define (start)
  22. (if (< (random:uniform) 0.6) ; Als het willekeurige nummer kleiner
  23. ; is dan 0.6
  24. (e) ; Ga dan naar de 'e' toestand
  25. (n))) ; Zo niet, ga dan naar de 'n' toestand
  26. ;;; De 'e' toestand
  27. (define (e)
  28. (display "e") ; Laat de letter 'e' zien
  29. (let ((rand (random:uniform))) ; Verbindt een willekeurig nummer
  30. ; aan de naam "rand"
  31. (cond ((< rand 0.4) (e)) ; Als het willekeurige nummer
  32. ; kleiner is dan 0.4 ga dan naar 'e'
  33. ((< rand 0.9) (n)) ; Anders als het willekeurige
  34. ; nummer kleiner is dan 0.9 ga naar
  35. ; 'n'
  36. (else (eind))))) ; Als die beiden niet zo waren ga
  37. ; dan naar EIND
  38. ;;; De 'n' toestand
  39. (define (n)
  40. (display "n") ; Laat de letter 'n' zien
  41. (let ((rand (random:uniform))) ; Verbindt een willekeurig nummer
  42. ; aan de naam "rand"
  43. (cond ((< rand 0.3) (n)) ; Als het willekeurige nummer
  44. ; kleiner is dan 0.3 ga dan naar 'n'
  45. ((< rand 0.7) (e)) ; Anders als het willekeurige
  46. ; nummer kleiner is dan 0.7 ga naar
  47. ; 'e'
  48. (else (eind))))) ; Als die beiden niet zo waren ga
  49. ; dan naar EIND
  50. ;;; De EIND toestand
  51. (define (eind)
  52. (newline)) ; Beeindig de naam met een 'enter'
  53. ; en doe verder niks meer.
  54. ;;; De zogenaamde "random-state" van het systeem moet eerst worden
  55. ;;; gevoedt met een "seed", want anders geeft het programma elke keer
  56. ;;; dezelfde naam.
  57. (set! *random-state* (random-state-from-platform))
  58. ;;; Hier wordt de Markovketen gestart door in de BEGIN toestand te beginnen.
  59. (start)