思路:我们有n张牌,不妨先假设有一个洗牌函数shuffle(....),能完美的洗出n-1张牌 。拿第n张牌来打乱前面n-1的洗牌顺序,从而得到n张牌的最终结果。
举例说明:如果1,2,3三张牌,想完美洗牌,那么先让1,2洗牌洗好,再把3与其中之一(随机选取)进行交换,所以是递归思想,而非循环思想,差别是递归是等洗出n-1张牌再拿第n张牌去交换,如果要循环做,就是第n张牌去换一下n-1张牌其中之一
递归代码:
package main
import (
"fmt"
"math/rand"
"time"
)
func randNum(low, high int) int {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
return low + r.Intn(high-low+1)
}
func shuffle(arr []int, n int) {
if n <= 0 {
return
}
shuffle(arr, n-1)
rand := randNum(0, n)
arr[n], arr[rand] = arr[rand], arr[n]
}
func main() {
cards := []int{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 52}
cardslen := len(cards)
cardslen1 := cardslen / 4
for i := 1; i <= 10; i++ {
fmt.Printf("\n")
shuffle(cards, cardslen-1)
for j := 1; j <= cardslen; j++ {
fmt.Printf("%d ", cards[j-1])
if j%cardslen1 == 0 {
fmt.Printf("\n")
}
}
}
}