Skip to content
/ mt Public

Mersenne Twister; Pseudo Random Number Generator, Implemented by Golang

License

Notifications You must be signed in to change notification settings

goark/mt

Repository files navigation

goark/mt -- Mersenne Twister; Pseudo Random Number Generator, Implemented by Golang

check vulns lint status GitHub license GitHub release

This package is "Mersenne Twister" algorithm, implemented by pure Go.

  • required Go 1.22 or later
  • Compatible with math/rand/v2 standard package.
  • Concurrency-safe (if it uses mt.PRNG type)

Migrated repository to github.com/goark/mt

Usage

Import

import "github.com/goark/mt/v2"

Usage with math/rand/v2 Standard Package (not concurrency-safe)

package main

import (
    "fmt"
    "math/rand/v2"

    "github.com/goark/mt/v2/mt19937"
)

func main() {
    fmt.Println(rand.New(mt19937.New(19650218)).Uint64())
    //Output:
    //13735441942630277712
}

Usage of mt.PRNG type (concurrency-safe version)

package main

import (
    "fmt"

    "github.com/goark/mt/v2"
    "github.com/goark/mt/v2/mt19937"
)

func main() {
    fmt.Println(mt.New(mt19937.New(19650218)).Uint64())
    //Output:
    //13735441942630277712
}

Use io.Reader interface

package main

import (
    "encoding/binary"
    "fmt"
    "math/rand/v2"
    "sync"

    "github.com/goark/mt/v2"
    "github.com/goark/mt/v2/mt19937"
)

func main() {
    wg := sync.WaitGroup{}
    prng := mt.New(mt19937.New(rand.Int64()))
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            r := prng.NewReader()
            buf := [8]byte{}
            for i := 0; i < 10000; i++ {
                ct, err := r.Read(buf[:])
                if err != nil {
                    return
                }
                fmt.Println(binary.LittleEndian.Uint64(buf[:ct]))
            }
        }()
    }
    wg.Wait()
}

Benchmark Test

$ go test -bench Random -benchmem ./benchmark
goos: linux
goarch: amd64
pkg: github.com/goark/mt/v2/benchmark
cpu: AMD Ryzen 5 PRO 4650G with Radeon Graphics
BenchmarkRandomPCG-12              	785103775	         2.031 ns/op	       0 B/op	       0 allocs/op
BenchmarkRandomMT19917-12          	338082381	         3.551 ns/op	       0 B/op	       0 allocs/op
BenchmarkRandomPCGRand-12          	359948874	         3.288 ns/op	       0 B/op	       0 allocs/op
BenchmarkRandomMT19917Rand-12      	325159622	         3.687 ns/op	       0 B/op	       0 allocs/op
BenchmarkRandomChaCha8Locked-12    	186311572	         6.443 ns/op	       0 B/op	       0 allocs/op
BenchmarkRandomMT19917Locked-12    	128465040	         9.346 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	github.com/goark/mt/v2/benchmark	10.408s

License

This package is licensed under MIT license.