【问题标题】:Get a random boolean in python?在python中获取随机布尔值?
【发布时间】:2011-10-13 01:44:41
【问题描述】:

我正在寻找在 python 中获得随机布尔值的最佳方法(快速而优雅)(掷硬币)。

目前我使用的是random.randint(0, 1)random.getrandbits(1)

还有我不知道的更好的选择吗?

【问题讨论】:

  • 这是一个很好且有效的问题,关于获取随机布尔值的各种选项的性能,但我觉得迷失在所有基准测试的噪音中的是,表现最好的人节省不到一秒钟的时间在百万次迭代中表现最差。如果您来这里是为了寻找加速应用程序的方法,您可能应该先看看其他选项。

标签: python random


【解决方案1】:
import random
random.choice([True, False])

也可以。

【讨论】:

【解决方案2】:

亚当的回答相当快,但我发现random.getrandbits(1) 要快很多。如果你真的想要一个布尔值而不是一个长的那么

bool(random.getrandbits(1))

仍然是random.choice([True, False])的两倍左右

两种解决方案都需要import random

如果不优先考虑最大速度,那么random.choice 肯定会更好读。

请注意,由于属性查找,random.choice() 比仅choice()from random import choice 之后)慢。

$ python3 --version
Python 3.9.7
$ python3 -m timeit -s "from random import choice" "choice([True, False])"
1000000 loops, best of 5: 376 nsec per loop
$ python3 -m timeit -s "from random import choice" "choice((True, False))"
1000000 loops, best of 5: 352 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "getrandbits(1)"
10000000 loops, best of 5: 33.7 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "bool(getrandbits(1))"
5000000 loops, best of 5: 89.5 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "not getrandbits(1)"
5000000 loops, best of 5: 46.3 nsec per loop
$ python3 -m timeit -s "from random import random" "random() < 0.5"
5000000 loops, best of 5: 46.4 nsec per loop

【讨论】:

  • 如果我们只关注性能,not not random.getrandbits(1))bool 快;)
  • 您可能根本不需要转换为布尔值,因为 0/1 具有正确的真值。
  • 您可以通过 from random import getrandbits 进一步加快它的速度,以避免属性查找。 :-)
  • 实际上,缺少属性查找似乎是random() &lt; 0.5 最快的原因。使用from random import getrandbitsgetrandbitsrandom() &lt; 0.5快。
【解决方案3】:

找到更快的方法:

$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)"
10000000 loops, best of 3: 0.222 usec per loop
$ python -m timeit -s "from random import random" "True if random() > 0.5 else False"
10000000 loops, best of 3: 0.0786 usec per loop
$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.0579 usec per loop

【讨论】:

  • random() &gt; 0.5 已经评估为更快的布尔值!
  • random() &gt;= 0.5,否则你会有点偏向False。
  • random() &lt; 0.5 更有意义,因为将 0.5 更改为其他一些概率按预期工作
  • 已更改为random() &lt; 0.5,感谢@SimonLindholm 和@akxlr。
【解决方案4】:

你可以试试这个,它会产生随机生成的真假数组:

a=[bool(i) for i in np.array(np.random.randint(0,2,10))]

出:[真、真、真、真、真、假、真、假、真、假]

【讨论】:

    【解决方案5】:

    您可以使用Faker library,它主要用于测试,但能够提供各种虚假数据。

    安装:https://pypi.org/project/Faker/

    >>> from faker import Faker
    >>> fake = Faker()
    >>> fake.pybool()
    True
    

    【讨论】:

      【解决方案6】:

      我很好奇 numpy 答案的速度与其他答案相比的表现如何,因为这被排除在比较之外。要生成一个随机布尔值,这要慢得多,但如果你想生成多个,那么它会变得更快:

      $ python -m timeit -s "from random import random" "random() < 0.5"
      10000000 loops, best of 3: 0.0906 usec per loop
      $ python -m timeit -s "import numpy as np" "np.random.randint(2, size=1)"
      100000 loops, best of 3: 4.65 usec per loop
      
      $ python -m timeit -s "from random import random" "test = [random() < 0.5 for i in range(1000000)]"
      10 loops, best of 3: 118 msec per loop
      $ python -m timeit -s "import numpy as np" "test = np.random.randint(2, size=1000000)"
      100 loops, best of 3: 6.31 msec per loop
      

      【讨论】:

        【解决方案7】:

        这个问题的新方法是使用 Faker,您可以通过pip 轻松安装它。

        from faker import Factory
        
        #----------------------------------------------------------------------
        def create_values(fake):
            """"""
            print fake.boolean(chance_of_getting_true=50) # True
            print fake.random_int(min=0, max=1) # 1
        
        if __name__ == "__main__":
            fake = Factory.create()
            create_values(fake)
        

        【讨论】:

        • 您至少应该解释一下为什么您认为这是一个更好的解决方案,因为它涉及下载不同的包并且比较麻烦。
        • 我不同意反对票。如果您正在创建随机数据,那么您很可能会遇到 Faker 是一个非常有用的工具的情况。 fake.boolean() 语法简洁明了,易于其他人理解。
        • 不管这个包是否有用,完全没有解释为什么要考虑这个问题,这使得答案毫无用处。
        【解决方案8】:

        我喜欢

         np.random.rand() > .5
        

        【讨论】:

          【解决方案9】:

          如果你想生成一些随机布尔值,你可以使用 numpy 的 random 模块。来自documentation

          np.random.randint(2, size=10)
          

          将在开区间 [0,2) 中返回 10 个随机均匀整数。 size 关键字指定要生成的值的数量。

          【讨论】:

          • 我很好奇这种方法的速度对答案的执行情况,因为这个选项被排除在比较之外。要生成一个随机布尔值(这是问题),这要慢得多,但如果你想生成很多,那么这会更快: $ python -m timeit -s "from random import random" "random()
          猜你喜欢
          • 2012-07-13
          • 2013-10-13
          • 2012-01-15
          • 2017-09-05
          • 2016-08-13
          • 1970-01-01
          • 2023-03-28
          • 2022-07-06
          相关资源
          最近更新 更多