我试图编写一些代码,该代码将生成七组七个七个唯一的,非重复的数字,范围从1到49。但是,当我运行代码时,它陷入了无限循环的无休止地生成单个数字的过程。仅当我在main()下包括一个小if-else循环时才发生这种情况,该循环的功能是检查重复数字。
重复检查背后的逻辑有问题吗?
package main
import "fmt"
import "math/rand"
import "time"
func main() {
var j [7]int
var n []int
rand.Seed(time.Now().UTC().UnixNano())
for m := 0; m < 7; m++ {
for i := 0; i < 8; i++ {
if i < 7 {
var duplicate int = randInt(1, 49)
n = append(n, duplicate)
if i != 0 {
if !integerinarray(duplicate, n) {
j[i] = duplicate
} else {
i--
}
} else {
j[i] = duplicate
}
fmt.Print(j[i], " ")
} else {
fmt.Println("\n")
//fmt.Println(n)
}
}
}
}
func randInt(min int, max int) int {
return min + rand.Intn(max-min)
}
func integerinarray(a int, s []int) bool {
for _, b := range s {
if b == a {
return true
}
}
return false
}
答案 0 :(得分:2)
您是否没有使用rand软件包中的方法是有原因的吗?即:
package main
import (
"math/rand"
"time"
"fmt"
)
func main() {
rand.Seed(time.Now().UnixNano())
randomInts := rand.Perm(49)
// you can also rand.Shuffle an existing set in version 1.10+
var j [7][7]int
for i, v := range randomInts {
j[i/7][i%7] = v + 1
}
for i := 0; i < 7; i++ {
fmt.Println(j[i])
}
}
答案 1 :(得分:0)
首先,您需要格式化代码。 而且您的逻辑不正确。
更改为
if integerinarray(duplicate, n) {
您需要调试代码。
答案 2 :(得分:0)
我对您的程序做了一些修改,现在它可以解决您想要的问题了。
random_arr.go:
// distribute 1 ~ 49 to 7 group of arrays, each array contain 7 numbers,
// each element should appear one and only once,
package main
import (
"fmt"
"math/rand"
"time"
)
func init() {
rand.Seed(time.Now().UTC().UnixNano())
}
func main() {
var arr [7]int
var used []int
for i := 0; i < 7; i++ {
for j := 0; j < 7; {
for {
x := randInt(1, 50) // generate a random number,
if !checkInSlice(x, used) { // new unique,
arr[j] = x
j++
used = append(used, x)
break
}
}
}
fmt.Printf("[%d] array: %v\n", i, arr)
}
}
// generate random number in range [min, max),
func randInt(min int, max int) int {
return min + rand.Intn(max-min)
}
// check whether a number is in a slice,
func checkInSlice(a int, s []int) bool {
for _, b := range s {
if b == a {
return true
}
}
return false
}
执行:
开始运行random_arr.go
输出:
[0] array: [19 24 47 9 26 21 25]
[1] array: [43 8 27 45 48 16 1]
[2] array: [22 42 31 15 28 39 40]
[3] array: [33 35 11 44 14 36 20]
[4] array: [17 10 7 4 12 6 5]
[5] array: [46 32 13 2 30 49 18]
[6] array: [3 37 34 29 41 38 23]
关于更改:
if/else
的逻辑,使用另一个for
循环完成技巧(实际上更像是来自C或Java的while()
)。 br />
您的原始版本不必要地复杂,并且难以理解。rand.Intn()
,如果您希望数字范围为[0, 49]
,则需要传递50
,而不是49
。fmt.Printf()
中,您可以使用%v
或%#v
占位符轻松地打印数组或切片。init()
之前自动调用的main()
,(这是可选的)。可能的进一步改进:
0 ~ 1000000
)仍然有效。O(n)
算法。答案 3 :(得分:0)
一些我注意到的事情
这里有更多go最佳实践 https://talks.golang.org/2013/bestpractices.slide