在PHP中获取随机的布尔值(true/false)

89

在PHP中获取随机布尔值(真/假)最优雅的方法是什么?

我能想到以下几种方法:

$value = (bool)rand(0,1);

将整数强制转换为布尔类型是否有任何不利之处?

或者这是一种“官方”的做法吗?


2
mt_rand()rand()更好,查看这个答案 - HamZa
2
这是一个一行代码就能完成你需要的任务。你有什么缺点考虑吗? - Álvaro González
为了可读性,我建议使用 rand(0,1) == 1rand(0,1) > 0。虽然隐式转换已经有文档说明,但在我看来它有点难以阅读。 - Caramiriel
1
这是我会用的代码:array_rand(array(True, False)) - Amal Murali
4
如果你只需要检查一个值是否为“真”,就不必显式转换为bool类型。0表示假,1表示真。 - dteoh
4个回答

164

如果您不想要布尔转换(并非这有什么问题),您可以像这样轻松地将它转换为布尔值:

$value = rand(0,1) == 1;

基本上,如果随机值为1,则返回true,否则返回false。当然,值为01已经像布尔值一样 工作 了; 因此:

if (rand(0, 1)) { ... }

这是一种完全有效的条件,并将按预期工作。

或者,您可以使用mt_rand()进行随机数生成(它比rand()更好)。 您甚至可以在此代码中使用openssl_random_pseudo_bytes()

$value = ord(openssl_random_pseudo_bytes(1)) >= 0x80;

更新

在 PHP 7.0 中,您可以使用random_int()函数生成加密安全的伪随机整数:

$value = (bool)random_int(0, 1);

我知道这有点老了,但为什么不在你的第一个代码示例中使用类型安全比较(===)而不是强制转换(==)呢? - NerdOfCode
1
@NerdOfCode rand(0, 1)总是返回一个整数值,因此您不需要严格的类型安全比较;如果函数返回其他类型的值(例如falsenull),则情况将有所不同,这些值将被强制转换为0 - Ja͢ck

8
我使用一个简单的
rand(0,1) < 0.5

3
这也有助于微调随机性,并生成不仅仅是平均随机50%的随机布尔值,比如 rand(0, 1) < 0.25 - neave
5
我认为需要将rand(0, 100) < 25修改为有效 @neave。 - aland
3
值得注意的是,严格来说,这种方法略微偏向于“false”因为“true” = 0 - 0.499999,而“false” = 0.5 - 1.0 (多了0.000001)。 - Andrew

8

为了完整性,如果你想在if条件语句中使用它,无需进行强制类型转换,因为0被视为false,而mt_rand生成的随机整数范围如下:

if (mt_rand(0,1)) { // 0 = false, 1 = true
  // whatever
}

注意:mt_randrand快4倍

mt_rand()函数是旧的rand()函数的即插即用替代品。它使用一个具有已知特性的随机数生成器,使用“梅森旋转器”,将生成随机数的速度提高了四倍,而这比平均libc库中的rand()提供的速度更快。 (来源:https://www.php.net/manual/zh/function.mt-rand.php)


1

推荐使用 PHP Stan

1 === random_int(0, 1)

这取决于你需要什么,就性能而言,我认为使用random_int()rand()更耗费资源。关于这个问题可以参考https://dev59.com/vVcP5IYBdhLWcg3wi6gA - phaberest
PHPStan与给定问题有什么关系? - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接