| * * *
github代碼: https://github.com/Golangltd/codeclass/tree/master/ByteEdu.Com |

image

image

image

image
Rand.go:
package main
import (
"math/rand"
"time"
)
/*
作者:彬哥
來(lái)自:LollipopGo游戲服務(wù)器架構(gòu)
*/
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"
)
/*
作者:彬哥
來(lái)自:LollipopGo游戲服務(wù)器架構(gòu)
*/
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語(yǔ)言控制臺(tái)抽獎(jiǎng)
1. 抽獎(jiǎng)人,讀取配置文件(CSV)
2. 隨機(jī)方法,隨機(jī)數(shù)
3. 中獎(jiǎng)人信息寫入文件
*/
func init() {
}
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Println("--= www.ByteEdu.Com =--")
fmt.Println("--------活動(dòng)抽獎(jiǎng)--------")
fmt.Println("輸入規(guī)則:")
fmt.Println("A|1: A表示一等獎(jiǎng),1表示數(shù)量")
fmt.Println("B|2: B表示二等獎(jiǎng),2表示數(shù)量")
fmt.Println("C|3: C表示三等獎(jiǎng),3表示數(shù)量")
fmt.Println("注: 數(shù)量可以變化,例如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("輸入錯(cuò)誤!")
continue
}
// 獲取隨機(jī)數(shù)
count, errrr := strconv.Atoi(data[1])
if errrr != nil {
fmt.Println(errrr)
return
}
if count >= len(G_ByteEdu) {
fmt.Println("全體中獎(jiǎng)!,本輪抽獎(jiǎng)結(jié)束!")
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("抽獎(jiǎng)名單為空,請(qǐng)檢查抽獎(jiǎng)名單!,抽獎(jiǎng)結(jié)束!")
return
}
switch data[0] {
case "A":
{
fmt.Println("抽取一等獎(jiǎng)!")
for i, v := range icount {
fmt.Println(i, v)
_, ok := tmpmap[v]
if !ok {
msg := "恭喜:" + G_ByteEdu[v].Name + ",獲得一等獎(jiǎng)!"
fmt.Println(msg)
tmpmap[v] = v
WriteFileData(msg)
} else {
fmt.Println("很遺憾,無(wú)人中獎(jiǎng)!")
}
}
}
case "B":
{
fmt.Println("抽取二等獎(jiǎng)!")
for i, v := range icount {
fmt.Println(i, v)
_, ok := tmpmap[v]
if !ok {
fmt.Println("恭喜:" + G_ByteEdu[v].Name + ",獲得二等獎(jiǎng)!")
tmpmap[v] = v
} else {
fmt.Println("很遺憾,無(wú)人中獎(jiǎng)!")
}
}
}
case "C":
{
fmt.Println("抽取三等獎(jiǎng)!")
for i, v := range icount {
fmt.Println(i, v)
_, ok := tmpmap[v]
if !ok {
fmt.Println("恭喜:" + G_ByteEdu[v].Name + ",獲得三等獎(jiǎng)!")
tmpmap[v] = v
} else {
fmt.Println("很遺憾,無(wú)人中獎(jiǎng)!")
}
}
}
default:
fmt.Println("沒有中獎(jiǎng)!")
}
}
}