68 lines
1.6 KiB
PowerShell
68 lines
1.6 KiB
PowerShell
# Statistics/Basic
|
|
|
|
function Write-BasicStats {
|
|
param ([uint32]$SampleSize)
|
|
if ($SampleSize -lt 1) {
|
|
return
|
|
}
|
|
|
|
$r = [double[]]::new($SampleSize)
|
|
$h = [uint32[]]::new(10) # all zero by default
|
|
$sum = 0.0
|
|
$hSum = 0
|
|
|
|
# Generate '$SampleSize' random numbers in the interval [0, 1)
|
|
# calculate their $sum
|
|
# and in which box they will fall when drawing the histogram
|
|
$iTo = $SampleSize - 1
|
|
foreach ($i in 0..$iTo) {
|
|
$r[$i] = (Get-Random -Maximum 1.0)
|
|
$sum += $r[$i]
|
|
$h[[Math]::floor($r[$i] * 10)]++
|
|
}
|
|
foreach ($hItem in $h) {
|
|
$hSum += $hItem
|
|
}
|
|
# adjust one of the $h[] values if necessary to ensure $hSum = $SampleSize
|
|
$adj = $SampleSize - $hSum
|
|
if ($adj -ne 0) {
|
|
$iTo = $h.Length - 1
|
|
foreach ($i in 0..$iTo) {
|
|
$h[$i] += $adj
|
|
if ($h[$i] -ge 0) {
|
|
break
|
|
}
|
|
$h[$i] -= $adj
|
|
}
|
|
}
|
|
$mean = $sum / $SampleSize
|
|
|
|
$sum = 0.0
|
|
# Now calculate their standard deviation
|
|
foreach ($rItem in $r) {
|
|
$sum += [Math]::Pow($rItem - $mean, 2)
|
|
}
|
|
$sd = [Math]::Sqrt($sum / $SampleSize)
|
|
|
|
# Draw a histogram of the data with interval 0.1
|
|
# If sample size > 500 then normalize histogram to 500
|
|
[double]$scale = 1.0
|
|
if ($SampleSize -gt 500) {
|
|
$scale = 500.0 / $SampleSize
|
|
}
|
|
Write-Output "Sample size $SampleSize"
|
|
Write-Output (' Mean {0,8:N6} SD {1,8:N6}' -f $mean, $sd)
|
|
$i = 0
|
|
foreach ($hItem in $h) {
|
|
$out = ' {0,4:N2} : {1,5} ' -f ($i / 10.0), $hItem
|
|
Write-Output ($out + ('*' * [Math]::Round($hItem * $scale)))
|
|
$i++
|
|
}
|
|
}
|
|
|
|
Write-BasicStats 100
|
|
Write-Output ""
|
|
Write-BasicStats 1000
|
|
Write-Output ""
|
|
Write-BasicStats 10000
|
|
Write-Output ""
|