36 lines
1.1 KiB
Plaintext
36 lines
1.1 KiB
Plaintext
function Get-RandomNormal
|
|
{
|
|
[CmdletBinding()]
|
|
Param ( [double]$Mean, [double]$StandardDeviation )
|
|
|
|
$RandomNormal = $Mean + $StandardDeviation * [math]::Sqrt( -2 * [math]::Log( ( Get-Random -Minimum 0.0 -Maximum 1.0 ) ) ) * [math]::Cos( 2 * [math]::PI * ( Get-Random -Minimum 0.0 -Maximum 1.0 ) )
|
|
|
|
return $RandomNormal
|
|
}
|
|
|
|
# Standard deviation function for testing
|
|
function Get-StandardDeviation
|
|
{
|
|
[CmdletBinding()]
|
|
param ( [double[]]$Numbers )
|
|
|
|
$Measure = $Numbers | Measure-Object -Average
|
|
$PopulationDeviation = 0
|
|
ForEach ($Number in $Numbers) { $PopulationDeviation += [math]::Pow( ( $Number - $Measure.Average ), 2 ) }
|
|
$StandardDeviation = [math]::Sqrt( $PopulationDeviation / ( $Measure.Count - 1 ) )
|
|
return $StandardDeviation
|
|
}
|
|
|
|
# Test
|
|
$RandomNormalNumbers = 1..1000 | ForEach { Get-RandomNormal -Mean 1 -StandardDeviation 0.5 }
|
|
|
|
$Measure = $RandomNormalNumbers | Measure-Object -Average
|
|
|
|
$Stats = [PSCustomObject]@{
|
|
Count = $Measure.Count
|
|
Average = $Measure.Average
|
|
StandardDeviation = Get-StandardDeviation -Numbers $RandomNormalNumbers
|
|
}
|
|
|
|
$Stats | Format-List
|