summaryrefslogtreecommitdiff
path: root/diffpriv.go
diff options
context:
space:
mode:
Diffstat (limited to 'diffpriv.go')
-rw-r--r--diffpriv.go28
1 files changed, 26 insertions, 2 deletions
diff --git a/diffpriv.go b/diffpriv.go
index 8b945d3..f35dd9a 100644
--- a/diffpriv.go
+++ b/diffpriv.go
@@ -1,19 +1,36 @@
package main
import (
+ "fmt"
+ "math"
"math/rand"
+ "time"
)
+var (
+ rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
+)
+
+func main() {
+ fmt.Println(diffpriv(0, 1, 2))
+}
+
+func diffpriv(value, sensitivity, epsilon float64) float64 {
+ noise := laplaceDist(0, sensitivity/epsilon)
+ fmt.Println("noise: ", noise)
+ return round(float64(value) + noise)
+}
+
// Returns a random value from a laplace
// distribution with parameters u and b.
func laplaceDist(u, b float64) float64 {
- uniform := rand.Float64()
+ uniform := rnd.Float64()
uniform -= 0.5
return u - b*sgn(uniform)*math.Log(1-2*math.Abs(uniform))
}
// The signum function
-func sgn(x float64) flot64 {
+func sgn(x float64) float64 {
if x < 0 {
return -1
}
@@ -22,3 +39,10 @@ func sgn(x float64) flot64 {
}
return 0
}
+
+func round(n float64) float64 {
+ if n < 0 {
+ return math.Ceil(n - 0.5)
+ }
+ return math.Floor(n + 0.5)
+}