#lang racket ;;; probestlib3.rkt (rev. 2020.01.23) ;;; info: comer@cemati.org ;;; (c) ECB. Lab. CEMATi, TecNM/ITT ;;; (*) Uso didáctico (require math) (provide nums->string mediana cuantil data-g) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; funciones para lib. genérica (define exact inexact->exact) (define inex exact->inexact) (define (piso x) (inexact->exact (floor x))) (define (techo x) (inexact->exact (ceiling x))) (define (take-off-inter-random L) (define n (length L)) (cond ((<= n 2) L) (else (define j (random 1 (sub1 (length L)))) (define-values (pre post) (split-at L j)) (append pre (rest post))))) (define (reduce-inter-random L m) (define n (length L)) (cond ((or (<= n 2) (<= n m)) L) (else (reduce-inter-random (take-off-inter-random L) m)))) ;; si n>1 entrega una lista ;; de dos números que suman n ;; de otra forma entrega #f (define (suma-en-dos n) (cond ((<= n 1) #f) (else (define m (random 1 n)) (list m (- n m))))) (define (suma-en-dos-max L) (define mx (apply max L)) (define-values (pre post) (splitf-at L (λ(x) (not (= x mx))))) (define s2 (suma-en-dos mx)) (if s2 (append pre s2 (rest post)) L)) ;; crea una lista de k números ;; cuya suma es n (si kstring L) (define-values (Lis Ln) (split-at L (sub1 (length L)))) (append (list "( ") (map (λ (x) (string-append (number->string x) ", ")) Lis) (map number->string Ln) (list ")"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; inicio de funciones propias a probest ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; funciones para datos no agrupados (define (cuantil alf nums) (define onums (sort nums <)) (define n (length onums)) (define nalf (exact (* n alf))) (cond ((not (integer? nalf)) (list-ref onums (sub1 (techo nalf)))) (else (* 1/2 (+ (list-ref onums (sub1 nalf)) (list-ref onums nalf)))))) (define (mediana nums) (cuantil 0.5 nums)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; funciones para datos agrupados ;; entrega datos agrupados ;; con límites e_0,...e_k ;; para k clases, con un total ;; de n ocurrencias. (define (data-g k e0 ek dk n) (define ejj0 (range e0 (+ ek dk) dk)) (values (range 1 (add1 k)) (reduce-inter-random ejj0 (add1 k)) (sumaniza-random n k))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Demostraciones de uso básico (define (demo) (define dat1 (list 1 2 3 4)) (define dat2 (list 1 2 3 4 5)) (list (mediana dat1) (mediana dat2) (cuantil 0.25 dat1) (cuantil 0.75 dat1) (cuantil 0.25 dat2) (cuantil 0.75 dat2))) (define (demo2) (define-values (ks ejs njs) (data-g 4 0 40 5 20)) (list ks ejs njs)) ;;; eof probestlib3.rkt