控制for循环问题

chenlie · 2021-07-14 22:19:10 · 3515 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-07-14 22:19:10 的主题,其中的信息可能已经有所发展或是发生改变。

今天在工作中写了如下代码,
功能是生成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)
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3515 次点击  
加入收藏 微博
11 回复  |  直到 2021-07-26 20:38:48
cy422396350
cy422396350 · #1 · 4年之前

把 - - 改成条件++,不过一个道理 for i := 0; i < 4; { if !replace { offset[i] = r i++ } }

dagongrenzzZ
dagongrenzzZ · #2 · 4年之前
func main() {
    rand.Seed(time.Now().Unix())
    result := make(map[int32]struct{})
    for len(result) != 4 {
        r := rand.Int31n(100)
        result[r] = struct{}{}
    }
    fmt.Println(result)
}
cy422396350
cy422396350 · #3 · 4年之前
dagongrenzzZdagongrenzzZ #2 回复

```go func main() { rand.Seed(time.Now().Unix()) result := make(map[int32]struct{}) for len(result) != 4 { r := rand.Int31n(100) result[r] = struct{}{} } fmt.Println(result) } ```

这个挺好,赞

liangmanlin
liangmanlin · #4 · 4年之前
cy422396350cy422396350 #3 回复

#2楼 @dagongrenzzZ 这个挺好,赞

这也点赞啊?你们对性能没有追求?很明显都不是On复杂度

dagongrenzzZ
dagongrenzzZ · #5 · 4年之前
liangmanlinliangmanlin #4 回复

#3楼 @cy422396350 这也点赞啊?你们对性能没有追求?很明显都不是On复杂度

如果有更好的实现方法可以发出来,学习一下:)

chenlie
chenlie · #6 · 4年之前
dagongrenzzZdagongrenzzZ #2 回复

```go func main() { rand.Seed(time.Now().Unix()) result := make(map[int32]struct{}) for len(result) != 4 { r := rand.Int31n(100) result[r] = struct{}{} } fmt.Println(result) } ```

谢谢,用map不错, 不过这里是我简化了条件,实际这四个随机数的判断不是相等,是一个范围判断

liangmanlin
liangmanlin · #7 · 4年之前
dagongrenzzZdagongrenzzZ #5 回复

#4楼 @liangmanlin 如果有更好的实现方法可以发出来,学习一下:)

一个连续的区间,生成一个随机数后,会把这个区间切割成2个连续区间,这样说你能明白么

dagongrenzzZ
dagongrenzzZ · #8 · 4年之前
liangmanlinliangmanlin #7 回复

#5楼 @dagongrenzzZ 一个连续的区间,生成一个随机数后,会把这个区间切割成2个连续区间,这样说你能明白么

能参考一下你的实现方法吗?我想学习下On复杂度的具体优化措施:smile:

cy422396350
cy422396350 · #9 · 4年之前

他说的应该是类似二分法的方法,自己缩小随机范围,每一步成功随机缩小范围

lysShub
lysShub · #10 · 4年之前
liangmanlinliangmanlin #4 回复

#3楼 @cy422396350 这也点赞啊?你们对性能没有追求?很明显都不是On复杂度

咋不是O(n)了?重复只是极低概率,根本需要考虑

cy422396350
cy422396350 · #11 · 4年之前

说得对,极地的概率,可以不考虑重复的情况,在随机数多的时候,重复率高的情况可以考虑

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传