Verify distribution uniformity/Naive: Difference between revisions

Racket version with a chi squared test
(Racket version with a chi squared test)
Line 984:
}
distcheck(dice7.vec)</lang>
 
=={{header|Racket}}==
 
The code below implements a chi-squared test in order to determine
whether a given source of random numbers produce uniformly distributed
numbers.
 
<lang racket>
#lang racket
(require
racket/flonum (planet williams/science:4:5/science)
(only-in (planet williams/science/unsafe-ops-utils) real->float))
 
; (chi^2-goodness-of-fit-test observed expected df)
; Given: observed, a sequence of observed frequencies
; expected, a sequence of expected frequencies
; df, the degrees of freedom
; Result: P-value = 1-chi^2cdf(X^2,df) , the p-value
(define (chi^2-goodness-of-fit-test observed expected df)
(define X^2 (for/sum ([o observed] [e expected])
(/ (sqr (- o e)) e)))
(- 1.0 (chi-squared-cdf X^2 df)))
 
 
(define (is-uniform? rand n α)
; Use significance level α to test whether
; n small random numbers generated by rand
; have a uniform distribution.
 
; Observed values:
(define o (make-vector 10 0))
; generate n random integers from 0 to 9.
(for ([_ (+ n 1)])
(define r (rand 10))
(vector-set! o r (+ (vector-ref o r) 1)))
; Expected values:
(define ex (make-vector 10 (/ n 10)))
 
; Calculate the P-value:
(define P (chi^2-goodness-of-fit-test o ex (- n 1)))
; If the P-value is larger than α we accept the
; hypothesis that the numbers are distributed uniformly.
(> P α))
 
; Test whether the builtin generator is uniform:
(is-uniform? random 1000 0.05)
; Test whether the constant generator fails:
(is-uniform? (λ(_) 5) 1000 0.05)
</lang>
Output:
<lang racket>
#t
#f
</lang>
 
=={{header|Ruby}}==
Anonymous user