github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgRand/LcgCalculateConstants/LcgCalcuateConstants_test.go (about)

     1  package LcgCalculateConstants
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/bronze1man/kmg/kmgRand"
     7  )
     8  
     9  func TestLcgCalculateConstants(ot *testing.T) {
    10  	r := uint64(1e4)
    11  	a, c := LcgCalculateConstants(r, 0)
    12  	f := kmgRand.LcgTransformer{
    13  		Start: 0,
    14  		Range: r,
    15  		A:     a,
    16  		C:     c,
    17  	}
    18  	hasValueMap := make([]bool, r)
    19  	for i := uint64(0); i < r; i++ {
    20  		out := f.GenerateInRange(i)
    21  		hasValueMap[int(out)] = true
    22  	}
    23  	for i := uint64(0); i < r; i++ {
    24  		if hasValueMap[i] != true {
    25  			ot.Fatalf("[BenchmarkLcgCalculateConstants] value %d not generate", i)
    26  		}
    27  	}
    28  	/*
    29  		验证某个实际参数是正确的
    30  		r = 1e8
    31  		f = kmgRand.LcgTransformer{
    32  			Start: 0,
    33  			Range: 1e8,
    34  			A:     671088641,
    35  			C:     2531011,
    36  		}
    37  		hasValueMap = make([]bool, r)
    38  		for i := uint64(0); i < r; i++ {
    39  			out:= f.GenerateInRange(i)
    40  			hasValueMap[int(out)] = true
    41  		}
    42  		for i := uint64(0); i < r; i++ {
    43  			if hasValueMap[i]!=true{
    44  				ot.Fatalf("[BenchmarkLcgCalculateConstants] value %d not generate",i)
    45  			}
    46  		}
    47  	*/
    48  	/*
    49  		   修正计算参数
    50  			r=  uint64(1e8)
    51  			a, c = LcgCalculateConstants(r, 0)
    52  			for ;a<1e9;a=(a-1)*2+1{
    53  				f = kmgRand.LcgTransformer{
    54  					Start: 1e8,
    55  					Range: r,
    56  					A:     a,
    57  					C:     c,
    58  				}
    59  				if !isRandomNess(f){
    60  					continue
    61  				}
    62  				fmt.Println(r,a,c)
    63  				for i := uint64(0); i < 100; i++ {
    64  					out:= f.GenerateInRange(i)
    65  					fmt.Printf("%d ",out)
    66  				}
    67  				fmt.Println()
    68  			}
    69  	*/
    70  }
    71  
    72  //需要33.2ns,考虑到仅计算Generate需要20ns,应该没有优化空间了
    73  func BenchmarkLcgCalculateConstants(b *testing.B) {
    74  	//t := kmgTest.NewTestTools(b)
    75  	r := uint64(b.N)
    76  	a, c := LcgCalculateConstants(r, 0)
    77  	f := kmgRand.LcgTransformer{
    78  		Start: 0,
    79  		Range: r,
    80  		A:     a,
    81  		C:     c,
    82  	}
    83  	hasValueMap := make([]bool, r)
    84  	for i := uint64(0); i < r; i++ {
    85  		out := f.GenerateInRange(i)
    86  		hasValueMap[int(out)] = true
    87  	}
    88  	for i := uint64(0); i < r; i++ {
    89  		//t.Equal(hasValueMap[i],true)    //使用快捷方法需要120ns
    90  		if !hasValueMap[i] {
    91  			b.Fatalf("[BenchmarkLcgCalculateConstants] value %d not generate", i)
    92  		}
    93  	}
    94  }
    95  func int64abs(i uint64) uint64 {
    96  	if int64(i) > 0 {
    97  		return i
    98  	} else {
    99  		return uint64(-int64(i))
   100  	}
   101  }
   102  func isRandomNess(f kmgRand.LcgTransformer) bool {
   103  	for _, i := range []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} {
   104  		if int64abs(f.GenerateInRange(i)-f.GenerateInRange(0)) < 1e6 &&
   105  			int64abs(f.GenerateInRange(2*i)-f.GenerateInRange(i)) < 1e6 {
   106  			return false
   107  		}
   108  	}
   109  
   110  	return true
   111  }