Golang 洗牌算法(乱序算法);需求背景:从一个文件下下读取所有文件,获取他们的名字, 将名字乱序排序,按着乱序后的序列,通过名字去找到文件,再上传,以达到上传文件的序列据原始序列相比是乱序的。
package src
import (
"fmt"
"io/ioutil"
"math/rand"
"os"
"time"
)
// Shuffle ...
// @Description:洗牌算法(乱序算法);需求背景:从一个文件下下读取所有文件,获取他们的名字,
// 将名字乱序排序,按着乱序后的序列,通过名字去找到文件,再上传,以达到上传文件的序列据原始序列相比是乱序的。
func Shuffle() {
var testFunc1 = func() {
dir, err := os.ReadDir("D:\\sorttest")
if err != nil {
fmt.Println(err)
}
var total = len(dir)
var originOrder = make([]string, total)
var shuffledOrder = make([]string, total)
for i, info := range dir {
originOrder[i] = info.Name()
}
fmt.Println("originOrder:\n", originOrder)
fmt.Println("--------- start shuffle Func1 【 Fisher-Yates Shuffle 】 ----------")
rand.Seed(time.Now().UnixNano())
var shuffleFunc1 = func() {
for i := total; i > 0; i-- {
j := rand.Intn(i)
shuffledOrder[i-1] = originOrder[j] // 将随机下标对应的数值取出 倒插进新数组中
originOrder = append(originOrder[0:j], originOrder[j+1:]...) // 删除已经取出的值,不删的话 再次随机到此下标 会 取到相同的值
//fmt.Println("------processing----\n", shuffledOrder)
}
}
shuffleFunc1()
fmt.Println("originOrder:\n", originOrder)
fmt.Println("shuffledOrder:\n", shuffledOrder)
}
var testFunc2 = func() {
dir, err := ioutil.ReadDir("D:\\sorttest")
if err != nil {
fmt.Println(err)
}
var total = len(dir)
var originOrder = make([]string, total)
for i, info := range dir {
originOrder[i] = info.Name()
}
fmt.Println("originOrder:\n", originOrder)
fmt.Println("-------- start shuffle Func2 【 Knuth-Durstenfeld Shuffle 】---------")
rand.Seed(time.Now().UnixNano())
var shuffleFunc2 = func() {
for i := total - 1; i > 0; i-- {
j := rand.Intn(i)
originOrder[i], originOrder[j] = originOrder[j], originOrder[i]
}
}
shuffleFunc2()
fmt.Println("shuffledOrder:\n", originOrder)
}
testFunc1()
fmt.Println("\n\n\n=================\n\n\n")
testFunc2()
}
originOrder:
[0.json 1.json 10.json 11.json 12.json 13.json 14.json 2.json 3.json 4.json 5.j
son 6.json 7.json 8.json 9.json]
--------- start shuffle Func1 【 Fisher-Yates Shuffle 】 ----------
originOrder:
[]
shuffledOrder:
[8.json 11.json 12.json 2.json 3.json 1.json 6.json 14.json 0.json 4.json 10.js
on 5.json 13.json 9.json 7.json]
=================
originOrder:
[0.json 1.json 10.json 11.json 12.json 13.json 14.json 2.json 3.json 4.json 5.j
son 6.json 7.json 8.json 9.json]
-------- start shuffle Func2 【 Knuth-Durstenfeld Shuffle 】---------
shuffledOrder:
[2.json 14.json 7.json 10.json 4.json 8.json 11.json 5.json 12.json 0.json 1.js
on 3.json 13.json 9.json 6.json]