在抖音上一直有一道争论不休的概率题:一个家庭有两个孩子,已知一个是男孩,另外一个也是男孩的概率是多大?A.1/2 B.1/3
对于概率论这个东西吧,我承认学的比较一般,尤其也没考过研所以对于大部分概率题是不敢去插嘴的。不过这个题感觉我又行了!
我秉承的观点是,概率是对大量随机事件分布统计结果的归纳与数学化。所以个人观点,就是把所有有两个孩子的家庭邀请过来,请两个女孩的家庭先回去,然后统计剩下这些有一个男孩的家庭数量a,再统计另外一个也是男孩的数量b,然后用b/a就得到了最终的概率。
鉴于芯片验证环境就是使用大量随机来模拟真实环境的,那么不妨我们用UVM的仿真环境来实测一下。使用 gen_uvm_agent 生成一个测试环境,那么不如我们就把两个孩子起名信号boy为0代表女孩为1代表男孩,之后根据题目进行一下约束:
rand bit [2 -1:0] boy; constraint boy_transaction::boy_cons{ |boy[1:0] == 1'b1; }
约束也很简单,有一个是男孩那就是两个孩子“或”在一起是1就可以了,除此之外再没有其他的限制。那么接下来,让我们收集10000个家庭的情况也就是发10000个包,在driver中进行统计:
if(req.boy[1:0] == 2'b11)begin boy_boy_cnt++; end
统计什么也很简单,就统计“2'b11”的家庭数量看看另一个也是男孩的总数是多少,然后在仿真结束后把boy_boy_cnt的数量打出来!
很显然,统计结果和我们的预期是一点都一样的:
UVM_INFO /home/xiaotu/Git_Path/gen_uvm_agent/gen_uvm_agent/boy_utils/src/boy_scb.sv(54) @ 1967530000: uvm_test_top.env.scb [boy_scb] Compare SUCCESSFULLY boy-boy cnt = 3331 UVM_INFO /tools/synopsys/vcs/vcs-mx_vL-2016.06/etc/uvm-1.2/base/uvm_report_server.svh(894) @ 1968890000: reporter [UVM/REPORT/SERVER]
显然,真实的统计结果就是10000个满足“一个家庭有两个孩子,已知一个是男孩”的家庭里,有3331个家庭满足“另外一个也是男孩”,所以概率是1/3。
已经把自己说服了(*^▽^*)