/src/random-weighted/source.scm

http://github.com/dharmatech/abstracting · Scheme · 38 lines · 24 code · 14 blank · 0 comment · 0 complexity · f61dc3e8fa62d1616a1b00e78b3ec5ce MD5 · raw file

  1. (define (probabilities weights)
  2. ((-> weights '/n)
  3. (-> weights 'sum)))
  4. (define (layers probabilities)
  5. (let ((n (+ (: probabilities 'len) 1)))
  6. ((-> (-> ((-> (int-to-vec n) 'map)
  7. (lambda (num)
  8. ((-> probabilities 'head) num)))
  9. 'rest)
  10. 'map)
  11. (lambda (v) (-> v 'sum)))))
  12. (define (random-weighted weights)
  13. ((-> ((-> (layers (probabilities weights)) 'map)
  14. (lambda (elt)
  15. (* 1000 elt)))
  16. 'index)
  17. (let ((n (random-integer 1000)))
  18. (lambda (elt)
  19. (> elt n)))))
  20. (define (call-random-weighted tbl)
  21. (let ((weights ((-> tbl 'map) (lambda (ent) (: ent 'first)))))
  22. (let ((i (random-weighted weights)))
  23. (let ((procedure (: ((-> tbl 'ref) i) 'second)))
  24. (procedure)))))