V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
lyonbrown4ddd
V2EX  ›  Go 编程语言

go 封装随机数生成

  •  
  •   lyonbrown4ddd · 2023-01-06 15:28:50 +08:00 · 1383 次点击
    这是一个创建于 687 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要封装一个随机数函数生成 类似于 ts 的这样

    function random(min?: number, max?: number): number {
      min = min === undefined ? Number.MIN_SAFE_INTEGER : min;
      max = max === undefined ? Number.MAX_SAFE_INTEGER : max;
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }
    

    想用上 go 的泛型 但是底层随机数都是 rand.类型 一下子不知道怎么写了 试了下 interface + switch(.type) 感觉不是很优雅 有没有 go 大佬 指点一下

    gogogo2000
        1
    gogogo2000  
       2023-01-06 16:34:37 +08:00
    func r(min int, max int) int {
    return rand.Intn(max-min+1) + min
    }
    lyonbrown4ddd
        2
    lyonbrown4ddd  
    OP
       2023-01-06 17:12:08 +08:00
    @gogogo2000 如果我想单函数同时支持 int float 等数字类型呢
    yaott2020
        3
    yaott2020  
       2023-01-06 18:02:21 +08:00 via Android
    那就泛型
    kumoocat
        4
    kumoocat  
       2023-01-07 00:22:31 +08:00
    ```golang
    package main

    import (
    "fmt"
    "math/rand"
    "time"

    "golang.org/x/exp/constraints"
    )

    func random[T constraints.Integer | constraints.Float](min, max T) T {
    rand.Seed(time.Now().UnixNano())
    return T(rand.Intn(int(max-min))) + min
    }

    func main() {
    fmt.Println(random(1.14, 5.14))
    fmt.Println(random(1, 5))
    }
    ```
    lyonbrown4ddd
        5
    lyonbrown4ddd  
    OP
       2023-01-07 10:58:22 +08:00
    @kumoocat 非常感谢 对 go 泛型还不是很熟练 没想到还可以 T()这样转
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:27 · PVG 08:27 · LAX 16:27 · JFK 19:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.