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 }