From bf231f4a81f242a9f26621dc746586825827655b Mon Sep 17 00:00:00 2001 From: elecbug Date: Thu, 20 Nov 2025 15:49:52 +0900 Subject: [PATCH 1/2] feat: update random --- p2p/helper.go | 78 ++++++++++++++++++++++++------------------------- p2p/p2p_test.go | 5 ++-- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/p2p/helper.go b/p2p/helper.go index ec3911b..aeea591 100644 --- a/p2p/helper.go +++ b/p2p/helper.go @@ -5,58 +5,58 @@ import ( "math/rand" ) -// LogNormalRand generates a log-normally distributed random number -// with given mu and sigma parameters. -func LogNormalRand(mu, sigma float64, src rand.Source) float64 { - r := rand.New(src) - - u1 := r.Float64() - u2 := r.Float64() - z := math.Sqrt(-2.0*math.Log(u1)) * math.Cos(2*math.Pi*u2) - - return math.Exp(mu + sigma*z) -} - -// PoissonRand generates a Poisson-distributed random integer -// with given lambda parameter. -func PoissonRand(lambda float64, src rand.Source) int { +// Poisson(λ): discrete distribution. +func PoissonRandom(lambda float64) int { L := math.Exp(-lambda) k := 0 p := 1.0 - - r := rand.New(src) - for p > L { k++ - p *= r.Float64() + p *= rand.Float64() } - return k - 1 } -// ExponentialRand generates an exponentially distributed random number -// with given rate parameter. -func ExponentialRand(rate float64, src rand.Source) float64 { - r := rand.New(src) - u := r.Float64() - return -math.Log(1-u) / rate +// LogNormal(μ, σ): continuous distribution. +func LogNormalRand(mu, sigma float64) float64 { + u1 := rand.Float64() + u2 := rand.Float64() + z := math.Sqrt(-2.0*math.Log(u1)) * math.Cos(2*math.Pi*u2) + return math.Exp(mu + sigma*z) } -// UniformRand generates a uniformly distributed random number -// between min and max. -func UniformRand(min, max float64, src rand.Source) float64 { - r := rand.New(src) - return min + r.Float64()*(max-min) +// Exponential(λ): continuous distribution. +func ExponentialRandom(lambda float64) float64 { + u := rand.Float64() + return -math.Log(1.0-u) / lambda } -// NormalRand generates a normally distributed random number -// with given mean and standard deviation. -func NormalRand(mean, stddev float64, src rand.Source) float64 { - r := rand.New(src) - - u1 := r.Float64() - u2 := r.Float64() +// Normal(μ, σ): Box-Muller transform. +func NormalRandom(mu, sigma float64) float64 { + u1 := rand.Float64() + u2 := rand.Float64() z := math.Sqrt(-2.0*math.Log(u1)) * math.Cos(2*math.Pi*u2) + return mu + sigma*z +} + +// Binomial(n, p): discrete distribution. +func BinomialRandom(n int, p float64) int { + count := 0 + for i := 0; i < n; i++ { + if rand.Float64() < p { + count++ + } + } + return count +} + +// Uniform(a, b): continuous distribution. +func UniformRandom(a, b float64) float64 { + return a + (b-a)*rand.Float64() +} - return mean + stddev*z +// Pareto(xm, α): continuous heavy-tailed distribution. +func ParetoRandom(xm, alpha float64) float64 { + u := rand.Float64() + return xm / math.Pow(1.0-u, 1.0/alpha) } diff --git a/p2p/p2p_test.go b/p2p/p2p_test.go index dbe739a..c6ce8cd 100644 --- a/p2p/p2p_test.go +++ b/p2p/p2p_test.go @@ -18,10 +18,9 @@ func TestGenerateNetwork(t *testing.T) { sg := standard_graph.NewStandardGraph() g := sg.ErdosRenyiGraph(1000, 50.000/1000, true) t.Logf("Generated graph with %d nodes and %d edges\n", len(g.Nodes()), g.EdgeCount()) - src := rand.NewSource(time.Now().UnixNano()) - nodeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.5, src) } - edgeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.3, src) } + nodeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.5) } + edgeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.3) } nw, err := p2p.GenerateNetwork(g, nodeLatency, edgeLatency, &p2p.Config{GossipFactor: 0.35}) if err != nil { From f732953f1ae88c7b36ef78f672e0562a4990a120 Mon Sep 17 00:00:00 2001 From: elecbug Date: Thu, 20 Nov 2025 15:50:00 +0900 Subject: [PATCH 2/2] feat: update random --- p2p/p2p_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/p2p/p2p_test.go b/p2p/p2p_test.go index c6ce8cd..328a3fb 100644 --- a/p2p/p2p_test.go +++ b/p2p/p2p_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "math" - "math/rand" "os" "testing" "time" @@ -87,10 +86,9 @@ func TestMetrics(t *testing.T) { sg := standard_graph.NewStandardGraph() g := sg.ErdosRenyiGraph(1000, 50.000/1000, true) t.Logf("Generated graph with %d nodes and %d edges\n", len(g.Nodes()), g.EdgeCount()) - src := rand.NewSource(time.Now().UnixNano()) - nodeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.5, src) } - edgeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.3, src) } + nodeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.5) } + edgeLatency := func() float64 { return p2p.LogNormalRand(math.Log(100), 0.3) } nw, err := p2p.GenerateNetwork(g, nodeLatency, edgeLatency, &p2p.Config{GossipFactor: 0.35}) if err != nil {