我希望有一个函数,我可以调用随机true或false每次调用:
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)
| 归档时间: |
|
| 查看次数: |
2270 次 |
| 最近记录: |