| * * *
github代码: https://github.com/Golangltd/codeclass/tree/master/ByteEdu.Com |
Rand.go:
package main
import (
"math/rand"
"time"
)
/*
作者:彬哥
来自:LollipopGo游戏服务器架构
*/
func init() {
rand.Seed(time.Now().UnixNano())
}
func RandGroup_LollipopGo(p ...uint32) int {
if p == nil {
panic("args not found")
}
r := make([]uint32, len(p))
for i := 0; i < len(p); i++ {
if i == 0 {
r[0] = p[0]
} else {
r[i] = r[i-1] + p[i]
}
}
rl := r[len(r)-1]
if rl == 0 {
return 0
}
rn := uint32(rand.Int63n(int64(rl)))
for i := 0; i < len(r); i++ {
if rn < r[i] {
return i
}
}
panic("bug")
}
func RandInterval_LollipopGo(b1, b2 int32) int32 {
if b1 == b2 {
return b1
}
min, max := int64(b1), int64(b2)
if min > max {
min, max = max, min
}
return int32(rand.Int63n(max-min+1) + min)
}
func RandIntervalN_LollipopGo(b1, b2 int32, n uint32) []int32 {
if b1 == b2 {
return []int32{b1}
}
min, max := int64(b1), int64(b2)
if min > max {
min, max = max, min
}
l := max - min + 1
if int64(n) > l {
n = uint32(l)
}
r := make([]int32, n)
m := make(map[int32]int32)
for i := uint32(0); i < n; i++ {
v := int32(rand.Int63n(l) + min)
if mv, ok := m[v]; ok {
r[i] = mv
} else {
r[i] = v
}
lv := int32(l - 1 + min)
if v != lv {
if mv, ok := m[lv]; ok {
m[v] = mv
} else {
m[v] = lv
}
}
l--
}
return r
}
WriteFile.go:
package main
import (
"fmt"
"os"
)
/*
作者:彬哥
来自:LollipopGo游戏服务器架构
*/
func WriteFileData(data string) {
f, err := os.OpenFile("ByteEdu.txt", os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
fmt.Println(err)
f.Close()
return
}
fmt.Fprintln(f, data)
err = f.Close()
if err != nil {
fmt.Println(err)
return
}
}
tmain.go:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
/*
Go语言控制台抽奖
1. 抽奖人,读取配置文件(CSV)
2. 随机方法,随机数
3. 中奖人信息写入文件
*/
func init() {
}
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Println("--= www.ByteEdu.Com =--")
fmt.Println("--------活动抽奖--------")
fmt.Println("输入规则:")
fmt.Println("A|1: A表示一等奖,1表示数量")
fmt.Println("B|2: B表示二等奖,2表示数量")
fmt.Println("C|3: C表示三等奖,3表示数量")
fmt.Println("注: 数量可以变化,例如A|12等")
tmpmap := make(map[int]int)
for {
fmt.Print("-> ")
text, _ := reader.ReadString('\n')
text = strings.Replace(text, "\r\n", "", -1)
// 截取字符
data := strings.Split(text, "|")
if len(data) != 2 {
fmt.Print("输入错误!")
continue
}
// 获取随机数
count, errrr := strconv.Atoi(data[1])
if errrr != nil {
fmt.Println(errrr)
return
}
if count >= len(G_ByteEdu) {
fmt.Println("全体中奖!,本轮抽奖结束!")
return
}
var icount []int
for iBINGE := 0; iBINGE < int(count); iBINGE++ {
ii := RandInterval_LollipopGo(0, int32(len(G_ByteEdu)))
icount = append(icount, int(ii))
}
if len(icount) == 0 {
fmt.Println("抽奖名单为空,请检查抽奖名单!,抽奖结束!")
return
}
switch data[0] {
case "A":
{
fmt.Println("抽取一等奖!")
for i, v := range icount {
fmt.Println(i, v)
_, ok := tmpmap[v]
if !ok {
msg := "恭喜:" + G_ByteEdu[v].Name + ",获得一等奖!"
fmt.Println(msg)
tmpmap[v] = v
WriteFileData(msg)
} else {
fmt.Println("很遗憾,无人中奖!")
}
}
}
case "B":
{
fmt.Println("抽取二等奖!")
for i, v := range icount {
fmt.Println(i, v)
_, ok := tmpmap[v]
if !ok {
fmt.Println("恭喜:" + G_ByteEdu[v].Name + ",获得二等奖!")
tmpmap[v] = v
} else {
fmt.Println("很遗憾,无人中奖!")
}
}
}
case "C":
{
fmt.Println("抽取三等奖!")
for i, v := range icount {
fmt.Println(i, v)
_, ok := tmpmap[v]
if !ok {
fmt.Println("恭喜:" + G_ByteEdu[v].Name + ",获得三等奖!")
tmpmap[v] = v
} else {
fmt.Println("很遗憾,无人中奖!")
}
}
}
default:
fmt.Println("没有中奖!")
}
}
}