程序语言有很多种,任意语言都可以完成该充满希望的需求,且实现方法也有多种
这里使用 golang 完成此希望工程,只当做示例参考,下面看代码:
package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
func main() {
getBalls()
}
func getBalls() {
// 定义红球数组
var redBalls [6]int
for i := 0; i < 6; i ++ {
for {
// 取随机红球
rand.Seed(time.Now().UnixNano())
num := rand.Intn(33) + 1
// 判断红球是否重复
if ifInBalls (num, redBalls) {
redBalls[i] = num
break
}else {
continue
}
}
}
// 从小到大排序
sort.Ints(redBalls[:])
// 定义篮球数组
var blueBall [1]int
// 取随机篮球
num := rand.Intn(16) + 1
blueBall[0] = num
// 输出结果
fmt.Println(redBalls, blueBall)
}
// 验证红球是否重复func
func ifInBalls(param int, list [6]int) bool {
for _, b := range list{
if b == param {
return false
}
}
return true
}
看下结果:
这里需要注意几点:
1. 业务注意点: 红球不能重复, 具体看 func ifInBalls 处理方法
2. 技术注意点: math.rand 是伪随机
伪随机生成的数字是确定的,不论在什么机器、什么时间,只要执行的随机代码一样,那么生成的随机数就一样,例如:
func main() {
rand.Seed(2)
for i := 0; i < 6; i++ {
println(rand.Intn(100))
}
}
// output
86
86
92
40
32
21
golang使用一个seed作为source来生成伪随机数字,默认seed为1,只要seed固定了,那么所有随机数就固定了...
这里有一个坑:如果seed固定,那么每次程序重启后重新生成随机数会重复上一次的随机数
既然这样就会出现红球重复问题, 那么我们可以每次使用不同的seed来启动程序,就可以保证每次启动都产生新的随机数,聪明的你肯定想到了使用时间戳:
// 取随机红球
rand.Seed(time.Now().UnixNano())
time.Now 是获取到秒 UnixNano 是毫秒
好了~今天希望工程就介绍到这里,下次继续.