-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpi-12.go
59 lines (53 loc) · 1.33 KB
/
pi-12.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// računanje pi po metodi Monte Carlo
// vzporedno, rešitev s kanali
// seme je fiksna vrednost, pri fiksnem številu gorutin so rezultati ponovljivi
package main
import (
"flag"
"fmt"
"math/rand"
"time"
)
type experiment struct {
shots int
hits int
value float64
}
var pi experiment
func piCalc(iterations int, seed int64, result chan experiment) {
rnd := rand.New(rand.NewSource(seed))
var mypi experiment
for i := 0; i < iterations; i++ {
x := rnd.Float64()
y := rnd.Float64()
mypi.shots++
if x*x+y*y < 1 {
mypi.hits++
}
}
result <- mypi
}
func main() {
// preberemo argumente
iPtr := flag.Int("i", 10000000, "# of iterations")
gPtr := flag.Int("g", 2, "# of goroutines")
sPtr := flag.Int64("s", 0, "random seed")
flag.Parse()
// odpremo kanal
piStream := make(chan experiment)
// razdelimo delo med gorutine in jih zaženemo
timeStart := time.Now()
for id := 0; id < *gPtr; id++ {
go piCalc(*iPtr / *gPtr, *sPtr+int64(100*id), piStream)
}
// preberemo vse vrednosti iz kanala
for i := 0; i < *gPtr; i++ {
mypi := <-piStream
pi.shots += mypi.shots
pi.hits += mypi.hits
}
pi.value = 4.0 * float64(pi.hits) / float64(pi.shots)
timeElapsed := time.Since(timeStart)
// izpišemo
fmt.Println("pi:", pi, "goroutines:", *gPtr, "time:", timeElapsed)
}