拒绝采样(reject sampling)Leetcode470

文章介绍了如何通过LeetCode题目470的方法,利用拒绝采样原理,结合随机数生成技术,生成1到10范围内的均匀随机整数。这种方法展示了在复杂问题中运用概率统计模拟,特别是MonteCarlo方法的一个实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人理解:通过拒绝样本中某些点出现的概率,来获取想要的样本的频率

leetcode 470 题解

给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。

题解:

微信图片_20210905012406.jpg

由于随机生成的范围10是大于7的,所以生成1次随机数无法生成1到10范围内,选择生成两次随机数,那么一共会有49中可能,

把49种可能均分为10次,且最后结果为整数,则需舍弃9种可能,只保留40种可能,则每个数字出现的概率都是4/49,概率相同,如果是40之外的可能,则重新生成

统计每一次结果对应的数值,%10的结果当作当前的结果

题解:

 public int Rand10() {

        int row,col,idx;

do

        {

            row=Rand7();

            col=Rand7();

            idx=col+(row-1)*7;

//idx的值是列数+(行数-1)*7表示这是第多少种可能

        }

        while(idx>40);

        return 1+(idx-1)%10;

//(idx-1)%10+1,表示以10种可能为一组,当前对应的输出应该是多少 

}

 LeetCode解释:

数值分析和计算统计中,拒绝采样是用于从分布生成观测值的基本技术。它通常也被称为接受拒绝方法或「接受拒绝算法」,是一种精确的模拟方法。该方法适用于具有密度的任何分布。

拒绝采样基于以下观察:在一维中对随机变量进行采样,可以对二维笛卡尔图执行均匀随机采样,并将样本保持在其密度函数图下的区域中.

知乎查找:

蒙特·卡罗方法(Monte Carlo method)也称统计模拟方法,通过重复随机采样模拟对象的概率与统计的问题,在物理、化学、经济学和信息技术领域均具有广泛应用。拒绝采样(reject sampling)就是针对复杂问题的一种随机采样方法。

首先举一个简单的例子介绍Monte Carlo方法的思想。假设要估计圆周率 π 的值,选取一个边长为1的正方形,在正方形内作一个内切圆,那么我们可以计算得出,圆的面积与正方形面积之比为 π/4 。现在在正方形内随机生成大量的点,如图1所示,落在圆形区域内的点标记为红色,在圆形区域之外的点标记为蓝色,那么圆形区域内的点的个数与所有点的个数之比,可以认为近似等于 π/4 。因此,Monte Carlo方法是通过随机采样的方式,以频率估计概率。

Monte Carlo方法估计pi的值

简单分布的采样,如均匀分布、高斯分布、Gamma分布等,在计算机中都已经实现,但是对于复杂问题的采样,就需要采取一些策略, 拒绝采样就是一种基本的采样策略,其采样过程如下:

给定一个概率分布 p(z)=1/(Zp)*p~(z) 其中 p~(z) 已知 Zp 为归一化常数,是未知的。要对该分布进行拒绝采样。首先定义一个参考分布 G ,概率密度函数 g(x) ,该分布可选均匀分布或高斯分布等。另外再定义一个辅助分布 U(0,1) ,为均匀分布。然后引入常数 k 使得对所有的 z 满足 kg(z)≤p~(z) ,然后开始进行采样,在每次采样中先从 g(z) 中采样一个 z0 ,然后在区间 [0,kg(z0)] 里进行均匀采样,得到 u0 。如果 u0<p~(z0) ,则接受,保留该采样值,否则拒绝,舍弃该采样值。最后得到的数据就是对该分布的一个近似采样。

 

### iptables `-A FORWARD -j REJECT` 的作用及功能 在 `iptables` 中,`-A FORWARD -j REJECT` 是一条用于控制数据包转发行为的规则。以下是这条规则的具体含义及其功能: #### 1. **FWD链的功能** `FORWARD` 链是 `iptables` 的五个内置链之一,主要用于处理那些需要通过本机路由到其他设备的数据包。如果一台机器配置为路由器,则所有经过此机器转发的数据包都会经过 `FORWARD` 链过滤[^3]。 #### 2. **规则解析** - **`-A FORWARD`**: 将规则附加 (`append`) 到 `FORWARD` 链中。 - **`-j REJECT`**: 表示当匹配到该规则时,执行的动作是拒绝 (`REJECT`) 数据包。这不仅会阻止数据包继续传输,还会向发送方返回一个错误消息(例如 ICMP 主机不可达),以便通知对方请求未成功完成[^2]。 因此,`-A FORWARD -j REJECT` 这条规则的作用是对所有试图通过当前主机进行转发的数据包实施拒绝操作,并告知源地址其请求已被拒收。 #### 3. **应用场景** 此类规则通常应用于以下场景: - 当希望完全封锁外部网络之间的通信而允许内部局域网正常运作时; - 或者作为默认策略的一部分,在确保安全性的同时提供反馈给尝试连接的一方知道他们的流量被阻断的原因[^4]。 #### 示例代码展示如何添加与删除这样的规则 下面展示了如何增加以及随后移除上述提到的那种类型的iptables规则: ```bash # 添加规则以拒绝所有的转发请求 sudo iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited # 查看现有规则列表确认新加入项是否存在 sudo iptables -L -v -n | grep REJECT # 删除之前所加上的那条特定规则 sudo iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited ``` 以上脚本先定义了一种针对任何进入forward路径下的封包都予以驳回的情况;接着利用显示命令验证设置是否生效;最后演示怎样安全地撤销这一变动[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值