今天在工作中写了如下代码,
功能是生成4个不相等的随机数,
领导非常不满意,说不要 在循环内 去改变计数器counter,
也就是下面不能在 for里面进行 i--,
请问大家有什么好的方法吗
func main() {
rand.Seed(time.Now().Unix())
offset := make([]int32, 4)
for i := 0; i < 4; i++ {
r := rand.Int31n(100)
if i > 0 {
isRepeat := false
for j := 0; j < i; j++ {
if r == offset[j] {
//重新随机
isRepeat = true
break
}
}
if isRepeat {
i--
continue
}
}
offset[i] = r
}
fmt.Println(offset)
}
有疑问加站长微信联系(非本文作者)

把 - - 改成条件++,不过一个道理 for i := 0; i < 4; { if !replace { offset[i] = r i++ } }
这个挺好,赞
这也点赞啊?你们对性能没有追求?很明显都不是On复杂度
如果有更好的实现方法可以发出来,学习一下:)
谢谢,用map不错, 不过这里是我简化了条件,实际这四个随机数的判断不是相等,是一个范围判断
一个连续的区间,生成一个随机数后,会把这个区间切割成2个连续区间,这样说你能明白么
能参考一下你的实现方法吗?我想学习下On复杂度的具体优化措施
他说的应该是类似二分法的方法,自己缩小随机范围,每一步成功随机缩小范围
咋不是O(n)了?重复只是极低概率,根本需要考虑
说得对,极地的概率,可以不考虑重复的情况,在随机数多的时候,重复率高的情况可以考虑