一、 50 % 50\% 50% 概率

先考虑一个最简单的情形,即生成的布尔型张量中,每个元素等于 True 的概率都为 50 % 50\% 50%。

思路很简单,我们只需创建两个形状相同的整型张量,里面的元素非 0 0 0 即 1 1 1,然后判断它们是否相等:

def randbool(*size):return torch.randint(2, size) == torch.randint(2, size)

例如:

print(randbool(3, 3))
# tensor([[False, False, False],
#         [False,  True,  True],
#         [ True, False,  True]])

这是因为,对于每一个元素,它在第一个张量中的取值只有两种可能: 0 0 0 或 1 1 1,在第二个张量中的取值也只有两种可能: 0 0 0 或 1 1 1,因此共有四种情形:

0 = = 0 ⇒ True 0 = = 1 ⇒ False 1 = = 0 ⇒ False 1 = = 1 ⇒ True \begin{aligned} 0 ==0\Rightarrow\;& \text{True} \\ 0 ==1\Rightarrow\; &\text{False} \\ 1==0\Rightarrow\; &\text{False} \\ 1==1\Rightarrow\; &\text{True} \\ \end{aligned} 0==0⇒0==1⇒1==0⇒1==1⇒​TrueFalseFalseTrue​

可以看出 True 的概率为 2 / 4 = 0.5 2/4=0.5 2/4=0.5。

我们还可以通过程序来验证 True 的概率:

s = 0
for i in range(10 ** 5):s += randbool(4, 4).sum().item()
s = s / 10 ** 5
print(s / 16)
# 0.499908125

将其封装成函数便于之后使用

def true_prob(fun):s = 0for i in range(10 ** 6):s += fun(10, 10).sum().item()return s / 10 ** 8

二、 1 / 3 1/3 1/3 概率

再来考虑一个也比较简单的情形,即生成的布尔型张量中,每个元素等于 True 的概率都为 1 / 3 1/3 1/3。

假设对于每一个元素,它在第一个张量中的取值只有两种可能: 0 , 1 0,1 0,1,但在第二个张量中的取值有三种可能: 0 , 1 , 2 0,1,2 0,1,2,因此共有六种情形:

0 = = 0 ⇒ True 0 = = 1 ⇒ False 0 = = 2 ⇒ False 1 = = 0 ⇒ False 1 = = 1 ⇒ True 1 = = 2 ⇒ False \begin{aligned} 0 ==0\Rightarrow\;& \text{True} \\ 0 ==1\Rightarrow\; &\text{False} \\ 0==2\Rightarrow\; &\text{False} \\ 1==0\Rightarrow\; &\text{False} \\ 1==1\Rightarrow\; &\text{True} \\ 1==2\Rightarrow\; &\text{False} \\ \end{aligned} 0==0⇒0==1⇒0==2⇒1==0⇒1==1⇒1==2⇒​TrueFalseFalseFalseTrueFalse​

可以看出 True 的概率为 2 / 6 = 1 / 3 2/6=1/3 2/6=1/3。

代码实现如下:

def randbool(*size):return torch.randint(2, size) == torch.randint(3, size)

验证:

print(true_prob(randbool))
# 0.33325818

三、任意概率

有没有可能指定 True 的概率为任意概率 p p p 呢?

答案是可以的,不过我们先来解释一下为什么之前的方法会行不通。

假设第一个张量的取值范围为 0 , 1 , ⋯ , m − 1 0,1,\cdots,m-1 0,1,⋯,m−1,第二个张量的取值范围为 0 , 1 , ⋯ , n − 1 0,1,\cdots,n-1 0,1,⋯,n−1,则总共会产生 m n mn mn 个判断条件,而这 m n mn mn 个判断条件里只有 min ⁡ ( m , n ) \min(m,n) min(m,n) 个为 True,因此 True 的概率为

P ( True ) = min ⁡ ( m , n ) m n = { 1 n , m ≤ n 1 m , m > n = 1 max ⁡ ( m , n ) P(\text{True})=\frac{\min(m,n)}{mn}= \begin{cases} \frac1n, &m\leq n \\ \frac1m, &m>n \\ \end{cases}=\frac{1}{\max(m,n)} P(True)=mnmin(m,n)​={n1​,m1​,​m≤nm>n​=max(m,n)1​

∀ p ∈ ( 0 , 1 ) \forall p\in(0,1) ∀p∈(0,1),令 P ( True ) = p P(\text{True})=p P(True)=p,则有 max ⁡ ( m , n ) = 1 p \max(m,n)=\frac1p max(m,n)=p1​,左边是整数,右边是浮点数,因此无法建立相等关系。即使对右边取整,我们也无法良好地去逼近这个概率 p p p。

例如,取 p = 0.7 p=0.7 p=0.7,则 1 p ≈ 1.428 \frac1p\approx 1.428 p1​≈1.428,对其取整后为 1 1 1 或 2 2 2,此时令 max ⁡ ( m , n ) \max(m,n) max(m,n) 为 1 1 1 或 2 2 2,则 P ( True ) P(\text{True}) P(True) 为 0.5 0.5 0.5 或 1 1 1,与真实的 0.7 0.7 0.7 相差甚远。

对于以上情形,只有当 p p p 充分小时才能良好地近似 p p p,而我们希望的是 ∀ p ∈ ( 0 , 1 ) \forall p\in(0,1) ∀p∈(0,1) 都能有良好的近似。为此考虑不再将张量中每个元素的值限定为整数,而是将其放松至 ( 0 , 1 ) (0,1) (0,1) 区间内的浮点数。对于每个元素,如果其值小于 p p p,则将该元素设置为 True,否则为 False,如下:

def randbool(size, p=0.5):return torch.rand(*size) < pdef true_prob(fun):s = 0for i in range(10 ** 6):s += fun((10, 10), 0.7).sum().item()return s / 10 ** 8print(true_prob(randbool))
# 0.69995753

PyTorch随机生成一个布尔型张量相关推荐

  1. 随机生成一个任意长度的字符串

    此方法主要作用:实现随机生成一个字符串,包括字符和数字,任意长度. 实现思路: 1 判断生成为字母还是数字 2 如果是数字可以直接取值 3 如果是字符则要判断为大写还是小写 4 通过一个字符串来接收各 ...

  2. Linux环境下编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜

    题目:编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜,如果用户猜的数大于答案,则提示大了,如果用户猜的数小于答案,则提示小了.当用户猜对时提示:猜对了. #! /bi ...

  3. python随机产生100个整数二进制_PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。...

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

  4. 随机生成一个1 到100之间的整数,从键盘输入数字进行猜数,一共可以猜5次

    9 猜数游戏,随机生成一个1 到100之间的整数,从键盘输入数字进行猜数,一共可以猜5次,如果猜小了在控制台输出猜小了,如果猜大了,在控制台输出猜大了,如果猜对了在控制台输入 恭喜你猜对了,并结束游戏 ...

  5. 编写Java程序,从键盘输入一个正整数n(n≥2),随机生成一个n阶方阵,每个元素均为整数,其取值范围为[100,999]。然后输出该方阵元素中的最大值和最小值。

    编写Java程序,从键盘输入一个正整数n(n≥2),随机生成一个n阶方阵,每个元素均为整数,其取值范围为[100,999].然后输出该方阵元素中的最大值和最小值. ```java package Ja ...

  6. 随机生成一个有向无环图

    写数据结构作业时想到的一个问题- 我们不妨先做一些这个随机的有向无环图的假设: 首先,它是个有向无环图,并且没有重边 假设随机从图中取出两个不相同的点,那么它们之间有边的概率为固定值(其实还可以有其他 ...

  7. 猜数字 随机生成一个1-100之间的数字,玩家进行猜测,如果猜错,提示玩家数字过大或者过小,如果猜对恭喜玩家胜利,并且退出游戏。

    案例:猜数字 要求:随机生成一个1-100之间的数字,玩家进行猜测,如果猜错,提示玩家数字过大或者过小,如果猜对恭喜玩家胜利,并且退出游戏. **限制随机数的范围 有时程序需要一个特定范围内的随机数. ...

  8. C++: 随机生成一个 RxC 列联表(附完整源码)

    C++: 随机生成一个 RxC 列联表 test.hpp test.cpp test.hpp int i4_max ( int i1, int i2 ); int i4_min ( int i1, i ...

  9. 2.8 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?

    试题描述 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少? 输入格式 一个整型范围内的整数,即初始时整型变量的值. 输出格式 一个整数,经过上述过程后得到 ...

最新文章

  1. Lift当中的AnyVarTrati源码解析
  2. NTRIP/ SUPL
  3. ERROR 3948 (42000): Loading local data is disabled问题解决
  4. Splay初步【bzoj1503】
  5. linux -rpm,linux 的rpm命令
  6. Java基础系列13:JDBC批处理简介
  7. VMware vsphere 中创建虚拟机的方法
  8. mysql表数据量太大,达到了1亿多条数据,除了分库分表之外,还有没有其他的解决方式?
  9. jquery系列教程4-事件操作全解
  10. 大数据分析的特点都有哪些
  11. Linux复习-硬盘相关知识点
  12. 如何购买微软的wince 等授权组件等?(找到了!)
  13. Linux服务器部署javaweb项目,从环境配置,到最终系统运行
  14. java程序员之路【转自尚学堂马士兵老师】
  15. 仿vista桌面小工具
  16. 完成原型设计的五个步骤
  17. 系统安装:双系统启动菜单
  18. 当我们在谈论机器人的时候我们在谈论什么?
  19. 泰拉瑞亚服务器云存档文件夹,泰拉瑞亚服务器云存档文件
  20. Python处理CSV文件(一)

热门文章

  1. ADS1220 24位高精度ADC芯片驱动
  2. 为什么世界上没有安全的工作?
  3. 个人所得税年度应纳税额抵扣-云服务器ECS入门-考试题及答案-申报更正流程
  4. 情人节c语言程序,情人节c语言代码.doc
  5. 《天龙八部》地形研究
  6. 全开源即时通讯(IM)系统 高仿微信,android移动应用开发
  7. 樊登读书搞定读后感_《读懂一本书:樊登读书法》读后感2
  8. 奥村マヨ - 見えない翼
  9. animation心形--表白
  10. AM5728 uboot 执行流程