小编典典

我怎样才能让函数随机返回true或false

go

我想要一个可以调用以随机truefalse每次调用的函数:

  randBoolean() // true
  randBoolean() // false
  randBoolean() // false
  randBoolean() // true

如何返回随机布尔值?


阅读 867

收藏
2020-07-02

共1个答案

小编典典

您需要某种随机信息,并且根据其值,可以true在一半的可能情况下返回它,而false在另一半情况下可以返回。

使用一个非常简单的例子rand.Float32()中的math/rand包:

func rand1() bool {
    return rand.Float32() < 0.5
}

不要忘记使用以下方法正确math/rand打包程序包,以使其在每次运行的应用程序中都不同rand.Seed()

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(rand1())
}

这是在的doc文件中提到的math/rand

如果每次运行需要不同的行为,请使用种子函数初始化默认的源。

如果不设置种子,则每次运行应用程序时都会返回相同的伪随机信息。

一些变化:

func rand2() bool {
    return rand.Int31()&0x01 == 0
}

func rand3() bool {
    return rand.Intn(2) == 0
}

一个有趣的解决方案,无需使用该math/rand软件包。它使用以下select语句:

func rand9() bool {
    c := make(chan struct{})
    close(c)
    select {
    case <-c:
        return true
    case <-c:
        return false
    }
}

说明:

select语句从可以继续进行而不会阻塞的情况中选择一种 随机
情况。由于可以立即进行从封闭渠道的接收,因此将随机选择2种情况之一,返回truefalse。请注意,但这并不是完全随机的,因为这不是该select语句的要求。

通道也可以移动到全局变量,因此无需在每次调用中创建一个通道或关闭一个通道:

var c = make(chan struct{})

func init() {
    close(c)
}

func rand9() bool {
    select {
    case <-c:
        return true
    case <-c:
        return false
    }
}
2020-07-02