392 lines
9.9 KiB
Go
392 lines
9.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"mongo.games.com/game/gamerule/ninelineking"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
println(time.Now().UnixNano())
|
|
println(fmt.Sprintf("%v", float64(1002340)))
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
min := 1000
|
|
max := 0
|
|
total := 0
|
|
times := 100
|
|
fmt.Println("---没干扰的情况下的击中次数")
|
|
for n := 0; n < times; n++ {
|
|
cnt := 0
|
|
for i := 0; i < 1000; i++ {
|
|
cnt++
|
|
if rand.Intn(100) == 1 {
|
|
total += cnt
|
|
if cnt < min {
|
|
min = cnt
|
|
}
|
|
if cnt > max {
|
|
max = cnt
|
|
}
|
|
fmt.Println("第", n+1, "次1%的概率,击中时的次数:", cnt)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("1%的概率,平均击杀次数", total/times, "最小", min, "最大", max)
|
|
fmt.Println("=========================")
|
|
fmt.Println("+++有干扰的情况下的击中次数")
|
|
total = 0
|
|
min = 1000
|
|
max = 0
|
|
for n := 0; n < times; n++ {
|
|
for m := 0; m < rand.Intn(1000); m++ {
|
|
rand.Float64()
|
|
}
|
|
cnt := 0
|
|
for i := 0; i < 1000; i++ {
|
|
cnt++
|
|
if rand.Intn(100) == 1 {
|
|
total += cnt
|
|
if cnt < min {
|
|
min = cnt
|
|
}
|
|
if cnt > max {
|
|
max = cnt
|
|
}
|
|
fmt.Println("第", n+1, "次1%的概率,击中时的次数:", cnt)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("1%的概率,平均击杀次数", total/times, "最小", min, "最大", max)
|
|
|
|
if false {
|
|
var lhPoker [52]int32
|
|
for i := 0; i < 52; i++ {
|
|
lhPoker[i] = int32(i)
|
|
}
|
|
lhDesc := []string{"0", "-", "1"}
|
|
lhWeight := []int32{47059, 5882, 47059}
|
|
RandSliceIndexByWight := func(s1 []int32) int {
|
|
total := int32(0)
|
|
for _, v := range s1 {
|
|
total += v
|
|
}
|
|
if total <= 0 {
|
|
return 0
|
|
}
|
|
random := rand.Int31n(total)
|
|
total = 0
|
|
for i, v := range s1 {
|
|
total += v
|
|
if random < total {
|
|
return i
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
_ = lhWeight
|
|
_ = RandSliceIndexByWight
|
|
var lhtotal [3]int
|
|
var lhTrend [100]int
|
|
for i := 0; i < 10000; i++ {
|
|
//fmt.Printf("---开始第[%d]局模拟---\r\n", i+1)
|
|
for j := 0; j < 100; j++ {
|
|
lhRand := rand.Perm(52)
|
|
//lhTrend[j] = RandSliceIndexByWight(lhWeight)
|
|
//fmt.Print(lhDesc[lhTrend[j]], " ")
|
|
lPoker := lhPoker[lhRand[0]]%13 + 1
|
|
hPoker := lhPoker[lhRand[1]]%13 + 1
|
|
if lPoker == hPoker {
|
|
lhTrend[j] = 1
|
|
} else if lPoker > hPoker {
|
|
lhTrend[j] = 0
|
|
} else {
|
|
lhTrend[j] = 2
|
|
}
|
|
lhtotal[lhTrend[j]]++
|
|
}
|
|
//fmt.Print("\r\n")
|
|
}
|
|
fmt.Println(lhtotal)
|
|
sum := 0
|
|
for i := 0; i < 3; i++ {
|
|
sum += lhtotal[i]
|
|
}
|
|
for i := 0; i < 3; i++ {
|
|
fmt.Print(lhDesc[i], ":", float64(lhtotal[i])/float64(sum), "% ")
|
|
}
|
|
fmt.Println()
|
|
}
|
|
//百牛路单模拟测试
|
|
if false {
|
|
var rd [4]*rand.Rand
|
|
for i := 0; i < 4; i++ {
|
|
rd[i] = rand.New(rand.NewSource(rand.Int63()))
|
|
}
|
|
|
|
var flagstr = []string{"输", "赢"}
|
|
for i := 0; i < 100; i++ {
|
|
fmt.Println("===第", i+1, "组路单")
|
|
var ld [4][20]int
|
|
for j := 0; j < 20; j++ {
|
|
for k := 0; k < 4; k++ {
|
|
ld[k][j] = rand.Intn(2) //rd[k].Intn(2)
|
|
}
|
|
}
|
|
var total int
|
|
var sum [4]int
|
|
for k := 0; k < 4; k++ {
|
|
var flag int
|
|
var maxlong int
|
|
var long int
|
|
v := ld[k][0]
|
|
for j := 0; j < 20; j++ {
|
|
sum[k] += ld[k][j]
|
|
if v == ld[k][j] {
|
|
long++
|
|
if long > maxlong {
|
|
maxlong = long
|
|
flag = v
|
|
}
|
|
} else {
|
|
v = ld[k][j]
|
|
long = 1
|
|
}
|
|
}
|
|
total += sum[k]
|
|
fmt.Println(ld[k], "胜率:", sum[k]*5, "%,", "长龙:", maxlong, "连", flagstr[flag])
|
|
}
|
|
|
|
var alllost int
|
|
var allwin int
|
|
for j := 0; j < 20; j++ {
|
|
flag := ld[0][j]
|
|
allsame := true
|
|
for k := 1; k < 4; k++ {
|
|
if ld[k][j] != flag {
|
|
allsame = false
|
|
break
|
|
}
|
|
}
|
|
if allsame {
|
|
if flag == 0 {
|
|
alllost++
|
|
} else {
|
|
allwin++
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("===20局总胜率", total*100/80, "%,", "通杀次数:", alllost, ",通赔次数", allwin)
|
|
}
|
|
}
|
|
|
|
//九线拉王模拟测试
|
|
if false {
|
|
type NineLintItem struct {
|
|
cards [ninelineking.NINELINEKINF_CARD_NUM]int32
|
|
allscore int32
|
|
allline int32
|
|
freeTimes int32
|
|
jackaptRatio float64
|
|
}
|
|
var freepool [180][]*NineLintItem
|
|
var pool [20000][]*NineLintItem
|
|
start := time.Now()
|
|
for i := 0; i < 1000000; i++ {
|
|
var cards [ninelineking.NINELINEKINF_CARD_NUM]int32
|
|
for i := 0; i < ninelineking.NINELINEKINF_CARD_NUM; i++ {
|
|
cards[i] = rand.Int31n(ninelineking.KindOfCard_KingMax)
|
|
}
|
|
allscore, allline, freeTimes, jackaptRatio, _, _ := ninelineking.CalcuNineLineKingScore(cards[:], 9)
|
|
pool[allscore] = append(pool[allscore], &NineLintItem{
|
|
cards: cards,
|
|
allscore: allscore,
|
|
allline: allline,
|
|
freeTimes: freeTimes,
|
|
jackaptRatio: jackaptRatio,
|
|
})
|
|
if freeTimes > 0 {
|
|
freepool[freeTimes] = append(freepool[freeTimes], &NineLintItem{
|
|
cards: cards,
|
|
allscore: allscore,
|
|
allline: allline,
|
|
freeTimes: freeTimes,
|
|
jackaptRatio: jackaptRatio,
|
|
})
|
|
}
|
|
}
|
|
fmt.Println("NineLine take:", time.Now().Sub(start))
|
|
//for k, v := range pool {
|
|
// if len(v) > 0 {
|
|
// fmt.Println("allscore:", k, "count:", len(v))
|
|
// }
|
|
//}
|
|
|
|
fmt.Println("freetimes :", len(freepool))
|
|
sumline := int32(0)
|
|
for k, v := range freepool {
|
|
if len(v) > 0 {
|
|
fmt.Println("freetimes:", k)
|
|
for i := 0; i < len(v); i++ {
|
|
fmt.Println("freetime:", v[i].freeTimes, "score:", v[i].allscore, "lines:", v[i].allline)
|
|
sumline += v[i].allline
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("total line:", sumline)
|
|
}
|
|
// start := time.Now()
|
|
// var t *time.Timer
|
|
// t = time.AfterFunc(randomDuration(), func() {
|
|
// fmt.Println(time.Now().Sub(start))
|
|
// t.Reset(randomDuration())
|
|
// })
|
|
// time.Sleep(5 * time.Second)
|
|
// for i := 0; i < 100; i++ {
|
|
// fmt.Println(rand.Int31n(4))
|
|
// }
|
|
// m := make(map[int][]int)
|
|
// fmt.Println(len(m[1]))
|
|
// var mm []int32
|
|
// fmt.Println(len(mm))
|
|
// Comb(100, 5)
|
|
// for dayIdx := 0; dayIdx <= 6; dayIdx++ {
|
|
// tNow := time.Now()
|
|
// tStart := tNow.AddDate(0, 0, int(-dayIdx))
|
|
// tStart = time.Date(tStart.Year(), tStart.Month(), tStart.Day(), 0, 0, 0, 0, tStart.Location())
|
|
// tEnd := tStart.AddDate(0, 0, 1)
|
|
// fmt.Println(tStart, "-", tEnd)
|
|
// }
|
|
|
|
// type TestCase struct {
|
|
// hands [5]int32
|
|
// kind int32
|
|
// ok *bullfight.CardsInfoO
|
|
// }
|
|
// p := bullfight.NewPoker()
|
|
// for i := 0; i < 100; i++ {
|
|
// p.Reset()
|
|
// var players [5]TestCase
|
|
// for j := 0; j < 5; j++ {
|
|
// players[j].kind = rand.Int31n(bullfight.KindOfCard_Max - 3)
|
|
// for m := 0; m < 4; m++ {
|
|
// players[j].hands[m] = int32(p.Next())
|
|
// }
|
|
// old := int32(p.Next())
|
|
// players[j].hands[4] = old
|
|
// players[j].ok = bullfight.KindOfCardFigureUpSington.FigureUpByCard(players[j].hands[:])
|
|
// if !(players[j].ok != nil && players[j].ok.GetKind() >= players[j].kind) {
|
|
// restCnt := p.Count()
|
|
// for k := 0; k < restCnt; k++ {
|
|
// players[j].hands[4] = int32(p.TryNextN(k))
|
|
// ok := bullfight.KindOfCardFigureUpSington.FigureUpByCard(players[j].hands[:])
|
|
// if ok != nil && ok.GetKind() >= players[j].kind {
|
|
// players[j].ok = ok
|
|
// p.ChangeNextN(k, bullfight.Card(old))
|
|
// break
|
|
// }
|
|
// if ok != nil && ok.GetKind() > players[j].ok.GetKind() {
|
|
// players[j].ok = ok
|
|
// }
|
|
// }
|
|
// }
|
|
// if players[j].ok != nil && players[j].ok.GetKind() >= players[j].kind {
|
|
// //fmt.Println("[ok]", i, j, players[j].hands, players[j].kind, players[j].ok)
|
|
// } else {
|
|
// fmt.Println("[ng]", i, j, players[j].hands, players[j].kind, players[j].ok)
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// dbConfig := mongo.DbConfig{
|
|
// Host: "127.0.0.1",
|
|
// Database: "jxjy_game",
|
|
// User: "mongouser",
|
|
// Password: "888",
|
|
// }
|
|
// dbConfig := mongo.DbConfig{
|
|
// Host: "192.168.1.50",
|
|
// Database: "superstar_game",
|
|
// User: "",
|
|
// Password: "",
|
|
// }
|
|
//mongo.Config.Dbs["user"] = dbConfig
|
|
//mongo.Config.Init()
|
|
//type PlayerData struct {
|
|
// Id bson.ObjectId `bson:"_id"`
|
|
// SnId int32 //数字唯一id
|
|
// Params []string //外部参数
|
|
// PlatformNickName string //平台昵称(base64,规避特殊字符)
|
|
// PlatformHead string //平台头像
|
|
// PlatformSex int //平台性别
|
|
//}
|
|
//playerrec := mongo.DatabaseC("user", "user_playerinfo")
|
|
//if playerrec != nil {
|
|
// var recs []model.PlayerData
|
|
// err := playerrec.Find(nil).All(&recs)
|
|
// if err == nil {
|
|
// fmt.Println(len(recs))
|
|
// for i := 0; i < len(recs); i++ {
|
|
// if recs[i].Params != nil && len(recs[i].Params) > 0 && recs[i].PlatformNickName == "" {
|
|
// if len(recs[i].Params) > 2 {
|
|
// recs[i].PlatformSex, _ = strconv.Atoi(recs[i].Params[2])
|
|
// }
|
|
// recs[i].PlatformNickName = base64.StdEncoding.EncodeToString([]byte(recs[i].Params[0]))
|
|
// if len(recs[i].Params) > 1 {
|
|
// recs[i].PlatformHead = recs[i].Params[1]
|
|
// }
|
|
// //err := playerrec.Update(bson.M{"snid": recs[i].SnId}, bson.D{{"$set", bson.D{{"platformnickname", name}, {"platformhead", head}, {"platformsex", sex}}}})
|
|
// err := playerrec.Update(bson.M{"_id": recs[i].Id}, &recs[i])
|
|
// //, bson.D{{"$set", bson.D{{"logintimes", acc.LoginTimes}, {"lastlogouttime", acc.LastLogoutTime}}}}
|
|
// if err != nil {
|
|
// fmt.Println(recs[i].SnId, "update failed", err)
|
|
// } else {
|
|
// fmt.Println(recs[i].SnId, "update success")
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
sInt := []int32{1, 1, 2, 4, 5, 1, 7, 8, 1}
|
|
for i := 0; i < len(sInt); i++ {
|
|
if sInt[i] == 1 {
|
|
sInt = append(sInt[:i], sInt[i+1:]...)
|
|
i--
|
|
}
|
|
}
|
|
|
|
fmt.Println(sInt)
|
|
}
|
|
|
|
func randomDuration() time.Duration {
|
|
return time.Duration(rand.Int63n(1e9))
|
|
}
|
|
|
|
func Comb(m, n int) [][]int {
|
|
comb := make([]int, m, m)
|
|
var all [][]int
|
|
comb[0] = n
|
|
var combination func(m, n int)
|
|
combination = func(m, n int) {
|
|
for i := m; i >= n; i-- {
|
|
comb[n] = i
|
|
if n > 1 {
|
|
combination(i-1, n-1)
|
|
} else {
|
|
var t []int
|
|
for j := comb[0]; j > 0; j-- {
|
|
t = append(t, comb[j])
|
|
}
|
|
all = append(all, t)
|
|
}
|
|
}
|
|
}
|
|
combination(m, comb[0])
|
|
fmt.Println(all)
|
|
return all
|
|
}
|