Statistics/Normal distribution: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: added whitespace, changed some comments, optimized the COSine function.) |
(Added Wren) |
||
Line 3,075: | Line 3,075: | ||
3,30-3,40 |
3,30-3,40 |
||
3,40-3,50 </pre> |
3,40-3,50 </pre> |
||
=={{header|Wren}}== |
|||
{{libheader|Wren-fmt}} |
|||
{{libheader|Wren-math}} |
|||
<lang ecmascript>import "random" for Random |
|||
import "/fmt" for Fmt |
|||
import "/math" for Nums |
|||
var rgen = Random.new() |
|||
// Box-Muller method from Wikipedia |
|||
var normal = Fn.new { |mu, sigma| |
|||
var u1 = rgen.float() |
|||
var u2 = rgen.float() |
|||
var mag = sigma * (-2 * u1.log).sqrt |
|||
var z0 = mag * (2 * Num.pi * u2).cos + mu |
|||
var z1 = mag * (2 * Num.pi * u2).sin + mu |
|||
return [z0, z1] |
|||
} |
|||
var N = 100000 |
|||
var NUM_BINS = 12 |
|||
var HIST_CHAR = "■" |
|||
var HIST_CHAR_SIZE = 250 |
|||
var bins = List.filled(NUM_BINS, 0) |
|||
var binSize = 0.1 |
|||
var samples = List.filled(N, 0) |
|||
var mu = 0.5 |
|||
var sigma = 0.25 |
|||
for (i in 0...N/2) { |
|||
var rns = normal.call(mu, sigma) |
|||
for (j in 0..1) { |
|||
var rn = rns[j] |
|||
var bn |
|||
if (rn < 0) { |
|||
bn = 0 |
|||
} else if (rn >= 1) { |
|||
bn = 11 |
|||
} else { |
|||
bn = (rn/binSize).floor + 1 |
|||
} |
|||
bins[bn] = bins[bn] + 1 |
|||
samples[i*2 + j] = rn |
|||
} |
|||
} |
|||
Fmt.print("Normal distribution with mean $0.2f and S/D $0.2f for $,d samples:\n", mu, sigma, N) |
|||
System.print(" Range Number of samples within that range") |
|||
for (i in 0...NUM_BINS) { |
|||
var hist = HIST_CHAR * (bins[i] / HIST_CHAR_SIZE).round |
|||
if (i == 0) { |
|||
Fmt.print(" -∞ ..< 0.00 $s $,d", hist, bins[0]) |
|||
} else if (i < NUM_BINS - 1) { |
|||
Fmt.print("$4.2f ..< $4.2f $s $,d", binSize * (i-1), binSize * i, hist, bins[i]) |
|||
} else { |
|||
Fmt.print("1.00 ... +∞ $s $,d", hist, bins[NUM_BINS - 1]) |
|||
} |
|||
} |
|||
Fmt.print("\nActual mean for these samples : $0.5f", Nums.mean(samples)) |
|||
Fmt.print("Actual S/D for these samples : $0.5f", Nums.stdDev(samples))</lang> |
|||
{{out}} |
|||
Specimen run: |
|||
<pre> |
|||
Normal distribution with mean 0.50 and S/D 0.25 for 100,000 samples: |
|||
Range Number of samples within that range |
|||
-∞ ..< 0.00 ■■■■■■■■■ 2,243 |
|||
0.00 ..< 0.10 ■■■■■■■■■■■■■ 3,250 |
|||
0.10 ..< 0.20 ■■■■■■■■■■■■■■■■■■■■■■■■ 5,977 |
|||
0.20 ..< 0.30 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 9,723 |
|||
0.30 ..< 0.40 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 13,104 |
|||
0.40 ..< 0.50 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15,601 |
|||
0.50 ..< 0.60 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15,469 |
|||
0.60 ..< 0.70 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 13,334 |
|||
0.70 ..< 0.80 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 9,659 |
|||
0.80 ..< 0.90 ■■■■■■■■■■■■■■■■■■■■■■■■ 6,119 |
|||
0.90 ..< 1.00 ■■■■■■■■■■■■■ 3,173 |
|||
1.00 ... +∞ ■■■■■■■■■ 2,348 |
|||
Actual mean for these samples : 0.50099 |
|||
Actual S/D for these samples : 0.25051 |
|||
</pre> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |