如何让函数随机返回true或false

Pet*_*leg 5 random boolean go

我希望有一个函数,我可以调用随机truefalse每次调用:

  randBoolean() // true
  randBoolean() // false
  randBoolean() // false
  randBoolean() // true
Run Code Online (Sandbox Code Playgroud)

如何返回随机布尔值?

问题1:使用go生成随机数会在每次调用时产生相同的结果.

icz*_*cza 16

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

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

func rand1() bool {
    return rand.Float32() < 0.5
}
Run Code Online (Sandbox Code Playgroud)

不要忘记math/rand在每个应用程序运行时使用rand.Seed()以下内容正确播种包:

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(rand1())
}
Run Code Online (Sandbox Code Playgroud)

这在包文档中提到math/rand:

如果每次运行需要不同的行为,请使用Seed函数初始化默认Source.

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

一些变化:

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

func rand3() bool {
    return rand.Intn(2) == 0
}
Run Code Online (Sandbox Code Playgroud)

一个有趣的解决方案,而不使用该math/rand包.它使用select声明:

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

说明:

select语句从可以不受阻塞地继续进行的随机案例中选择一个.由于从封闭通道接收可以立即进行,因此将随机选择2个案例中的一个,返回true或者false.请注意,这并非完全随机,因为这不是select声明的要求.

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

var c = make(chan struct{})

func init() {
    close(c)
}

func rand9() bool {
    select {
    case <-c:
        return true
    case <-c:
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 小澄清:你说_不要忘记为数学/ rand包正确播种它是随机的.函数**是**随机的,只是当没有调用`rand.Seed()`时,它们总是以相同的值(1)播种.这实际上可能是期望的行为(例如,用于测试事物). (2认同)
  • @Makkes你是对的,修正了不明确的措辞. (2认同)