實現方法(一)
利用rand函數進行隨機輸出,代碼如下:
package mainimport "fmt"import "math/rand"import "time"//確定一個切片是否是從大到小排列的,如果是返回“真”,不是則返回“假”。func isOrdered(list []int) bool { for i := 1; i < len(list); i++ { if list[i-1] > list[i] { //如果存在前一個元素大於後一個,則返回“假” return false } } return true}//讓切片中的元素隨機排列func randList(list []int) { duplicateList := make([]int, len(list)) copy(duplicateList, list) //用copy函數進行切片複製,這樣下面修改源切片(list)才不會影響到切片副本(duplicateList) rand.Seed(time.Now().UnixNano()) //使用當前的UNIX時間作為種子,不同的種子才能產生不同的隨機值 index := rand.Perm(len(list)) //使用rand.Perm(n)函數產生一個[0:n)的隨機切片,並按照隨機切片中的元素順序對源切片進行排序 for i, k := range index { list[i] = duplicateList[k] }}func main() { list := []int{1, 4, 3, 6, 9, 7, 2, 8, 5, 0} count := 0 for { if isOrdered(list) { fmt.Printf("\t排序完成!\n\t已排序%v次。\n\t排序結果為 %v\n", count, list) break } else { randList(list) count++ } }}
實現方法(二)
利用map每次的輸出為隨機值進行排序(實際發現這種方法不靠譜,其中幾個結果的出現頻率特別高,經常重複,等了很久也不能輸出正確結果)
代碼如下:
package mainimport ( "fmt")//將一個切片轉換為map,其中切片的元素的值為map的key,map的value統一為0func list2map(list []int) map[int]int { m := make(map[int]int) for _, v := range list { m[v] = 0 } return m}//將map的key輸出為切片,map的輸出是無序的,所以每次的輸出都應該是隨機的。func map2list(m map[int]int) []int { list := []int{} for i := range m { list = append(list, i) } return list}//確定一個切片是否是從大到小排列的,如果是返回“真”,不是則返回“假”。func isOrdered(list []int) bool { for i := 1; i < len(list); i++ { if list[i-1] > list[i] { //如果存在前一個元素大於後一個,則返回“假” return false } } return true}func main() { list := []int{3, 5, 2, 1} m := list2map(list) count := 0 for { if isOrdered(list) { fmt.Printf("\t排序完成!\n\t已排序%v次。\n\t排序結果為 %v\n", count, list) break } else { list = map2list(m) fmt.Println(list) count++ } }}