65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"math/rand"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
bigSample(1e7)
|
|
}
|
|
|
|
func bigSample(n int64) {
|
|
sum, ssq, h := reduce(0, n)
|
|
// compute final statistics and output as above
|
|
fmt.Println(n, "numbers")
|
|
m := sum / float64(n)
|
|
fmt.Println("Mean: ", m)
|
|
fmt.Println("Stddev:", math.Sqrt(ssq/float64(n)-m*m))
|
|
for _, c := range h {
|
|
fmt.Println(strings.Repeat("*", c*205/int(n)))
|
|
}
|
|
fmt.Println()
|
|
}
|
|
|
|
const threshold = 1e6
|
|
|
|
func reduce(start, end int64) (sum, ssq float64, h []int) {
|
|
n := end - start
|
|
if n < threshold {
|
|
d := getSegment(start, end)
|
|
return computeSegment(d)
|
|
}
|
|
// map to two sub problems
|
|
half := (start + end) / 2
|
|
sum1, ssq1, h1 := reduce(start, half)
|
|
sum2, ssq2, h2 := reduce(half, end)
|
|
// combine results
|
|
for i, c := range h2 {
|
|
h1[i] += c
|
|
}
|
|
return sum1 + sum2, ssq1 + ssq2, h1
|
|
}
|
|
|
|
func getSegment(start, end int64) []float64 {
|
|
d := make([]float64, end-start)
|
|
for i := range d {
|
|
d[i] = rand.Float64()
|
|
}
|
|
return d
|
|
}
|
|
|
|
func computeSegment(d []float64) (sum, ssq float64, h []int) {
|
|
for _, s := range d {
|
|
sum += s
|
|
ssq += s * s
|
|
}
|
|
h = make([]int, 10)
|
|
for _, s := range d {
|
|
h[int(s*10)]++
|
|
}
|
|
return
|
|
}
|