问题:
随机打乱一个数组
实质:
洗牌问题
方式:
Fisher-Yates算法
代码示例:
package main
import (
"errors"
"fmt"
"math/rand"
"time"
)
// 问题:随机打乱一个数组
// 实质:洗牌问题
// 方式:Fisher-Yates算法
// 代码示例:
func main() {
sli := []int64{1, 2, 3, 4, 5, 6, 7, 8}
newSli, err := solve(sli)
fmt.Printf("%+v \n", newSli)
fmt.Printf("%+v \n", err)
}
func init(){
rand.Seed(time.Now().UnixNano())
}
func solve(sli []int64) ([]int64, error) {
len := len(sli)
if len <= 1 {
return []int64{}, errors.New("参数不合法")
}
for i := len - 1; i > 0; i-- {
randNum := rand.Intn(i)
sli[i], sli[randNum] = sli[randNum], sli[i]
}
return sli, nil
}
结语:
随机数生成算法带来的误差,会造成洗牌的结果整体上不满足均匀分布。