**************************************************************
* 精简问题:
* 1. go有哪个随机函数的原理 跟“从一个大罐子里随机先后拿7个球”是比较接近的?
* 2.求个更效率的算法
**************************************************************
前几天支付宝蚂蚁积分换彩票,竟然中了5元钱,一下子又勾起我中学买彩票的回忆和欲望,但本人有选择恐惧症,正好是个“非程序员”,自己写个程序,但处理不重复那段写的太业余了,谁有更好的办法?
还有 go,有哪个随机函数的原理 跟“从一个大罐子里随机先后拿7个球”是比较接近的?感觉 rand.Seed(time.Now().UnixNano()) 这个函数跟系统时间挂钩,不够随机啊!
**************************************************************
大乐透投注区分为前区号码和后区号码,前区号码范围为01~35,后区号码范围为01~12。大乐透每期从35个前区号码中开出5个号码,从12个后区号码中开出2个号码作为中奖号码,大乐透玩法即是竟猜开奖号码的5个前区号码和2个后区号码,顺序不限。
<pre><code>
package main
import (
"math/rand"
"time"
"fmt"
)
//大乐透是7个数,前面是35选5,后面是12选2
func main() {
rand.Seed(time.Now().UnixNano())
var cp [7]int
i:=0
//前面的35选5
for {
a:=rand.Intn(36)
if a!=0 && a!=cp[0] &&a!=cp[1] && a!=cp[2] && a!=cp[3] && a!=cp[4] {
cp[i]=a
i++
if i==5{
break
}
}
}
//后面的12选2
for {
a:=rand.Intn(13)
if a!=0 && a!=cp[5] {
cp[i]=a
i++
if i==7{
break
}
}
}
//排序大小 前5个数
for i := 0; i < 5; i++ {
maxIndex := 0
for j := 1; j < 5-i; j++ {
if cp[j] > cp[maxIndex] {
maxIndex = j
}
}
cp[5-i-1], cp[maxIndex] = cp[maxIndex], cp[5-i-1]
}
//排序大小 后2个数
if cp[5]>cp[6]{
cp[5],cp[6]=cp[6],cp[5]
}
fmt.Println(cp)
}
</code></pre>
更多评论
用这个包
cryRand "crypto/rand"
maxBigInt := big.NewInt(maxNum)
tmp, _ := cryRand.Int(cryRand.Reader, maxBigInt)
写一个递归就行了,你那样写太复杂了
#3