PyTorch随机生成一个布尔型张量
一、 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 判断生成为字母还是数字 2 如果是数字可以直接取值 3 如果是字符则要判断为大写还是小写 4 通过一个字符串来接收各 ...
- Linux环境下编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜
题目:编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜,如果用户猜的数大于答案,则提示大了,如果用户猜的数小于答案,则提示小了.当用户猜对时提示:猜对了. #! /bi ...
- python随机产生100个整数二进制_PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。...
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- 随机生成一个1 到100之间的整数,从键盘输入数字进行猜数,一共可以猜5次
9 猜数游戏,随机生成一个1 到100之间的整数,从键盘输入数字进行猜数,一共可以猜5次,如果猜小了在控制台输出猜小了,如果猜大了,在控制台输出猜大了,如果猜对了在控制台输入 恭喜你猜对了,并结束游戏 ...
- 编写Java程序,从键盘输入一个正整数n(n≥2),随机生成一个n阶方阵,每个元素均为整数,其取值范围为[100,999]。然后输出该方阵元素中的最大值和最小值。
编写Java程序,从键盘输入一个正整数n(n≥2),随机生成一个n阶方阵,每个元素均为整数,其取值范围为[100,999].然后输出该方阵元素中的最大值和最小值. ```java package Ja ...
- 随机生成一个有向无环图
写数据结构作业时想到的一个问题- 我们不妨先做一些这个随机的有向无环图的假设: 首先,它是个有向无环图,并且没有重边 假设随机从图中取出两个不相同的点,那么它们之间有边的概率为固定值(其实还可以有其他 ...
- 猜数字 随机生成一个1-100之间的数字,玩家进行猜测,如果猜错,提示玩家数字过大或者过小,如果猜对恭喜玩家胜利,并且退出游戏。
案例:猜数字 要求:随机生成一个1-100之间的数字,玩家进行猜测,如果猜错,提示玩家数字过大或者过小,如果猜对恭喜玩家胜利,并且退出游戏. **限制随机数的范围 有时程序需要一个特定范围内的随机数. ...
- C++: 随机生成一个 RxC 列联表(附完整源码)
C++: 随机生成一个 RxC 列联表 test.hpp test.cpp test.hpp int i4_max ( int i1, int i2 ); int i4_min ( int i1, i ...
- 2.8 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?
试题描述 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少? 输入格式 一个整型范围内的整数,即初始时整型变量的值. 输出格式 一个整数,经过上述过程后得到 ...
最新文章
- Lift当中的AnyVarTrati源码解析
- NTRIP/ SUPL
- ERROR 3948 (42000): Loading local data is disabled问题解决
- Splay初步【bzoj1503】
- linux -rpm,linux 的rpm命令
- Java基础系列13:JDBC批处理简介
- VMware vsphere 中创建虚拟机的方法
- mysql表数据量太大,达到了1亿多条数据,除了分库分表之外,还有没有其他的解决方式?
- jquery系列教程4-事件操作全解
- 大数据分析的特点都有哪些
- Linux复习-硬盘相关知识点
- 如何购买微软的wince 等授权组件等?(找到了!)
- Linux服务器部署javaweb项目,从环境配置,到最终系统运行
- java程序员之路【转自尚学堂马士兵老师】
- 仿vista桌面小工具
- 完成原型设计的五个步骤
- 系统安装:双系统启动菜单
- 当我们在谈论机器人的时候我们在谈论什么?
- 泰拉瑞亚服务器云存档文件夹,泰拉瑞亚服务器云存档文件
- Python处理CSV文件(一)