我想要一个可以调用以随机true或false每次调用的函数:
true
false
randBoolean() // true randBoolean() // false randBoolean() // false randBoolean() // true
如何返回随机布尔值?
您需要某种随机信息,并且根据其值,可以true在一半的可能情况下返回它,而false在另一半情况下可以返回。
使用一个非常简单的例子rand.Float32()中的math/rand包:
rand.Float32()
math/rand
func rand1() bool { return rand.Float32() < 0.5 }
不要忘记使用以下方法正确math/rand打包程序包,以使其在每次运行的应用程序中都不同rand.Seed():
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语句:
select
func rand9() bool { c := make(chan struct{}) close(c) select { case <-c: return true case <-c: return false } }
说明:
该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 } }