Golang洗牌算法(Golang乱序算法)

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]

你可能感兴趣的:(算法)