拒绝采样(算法)总结

        先说说什么是拒绝采样算法:就类似于数学上的求阴影面积的方法,直接求求不出来,就用大面积 - 小面积 = 阴影面积的办法。

        所谓拒绝 和 采样 :就像是撒豆子计个数,计算概率问题一样,大桶里面套小桶,一把豆子撒下去,每个豆子都是一个“样本”,如果落在小桶外面的大桶里面去了,就“拒绝”这个样本,如果在小桶里,就“采用”这个样本, 就这样拒绝-和采用所有的豆子,小桶里面的豆子数量除以所有的豆子的数量就得到啊小桶在大桶里的占比,也就是豆子落在小桶里的概率……………………巴拉巴拉一些关于概率的问题就可以这样求解了。

这是力扣的两题,一一举例加以解释。

读题:现在有一个只能生成1、2、3、4、5、6、7这7个数字的随机函数Rand7(),问你如何用这个函数实现一个可以随机生成1~10的随机函数Rand10()(PS:随机函数,生成其中每个值的概率必须相等才行

想法:想想二进制(011010010111000010101010)这玩意,用两个Rand7()就可以生成7*7=49种选择,我们只要10种就够了,所以可以有

1和1、1和2、1和3   表示 1

1和4、1和5、1和6  表示  2

2和1、2和2、2和3   表示 3

2和4、2和5、2和6  表示  4

3和1、3和2、3和3   表示 5

3和4、3和5、3和6  表示  6

4和1、4和2、4和3   表示 7

4和4、4和5、4和6  表示  8

5和1、5和2、5和3   表示 9

5和4、5和5、5和6  表示  10

6和1、6和2、6和3   (拒绝表示)

6和4、6和5、6和6   (拒绝表示)

7和1、7和2、7和3   (拒绝表示)

7和4、7和5、7和6   (拒绝表示)

也就是:第一个Rand7() 只能生成1~5中的一个数,第二个Rand7()只能生成1~6中的一个数,不然就拒绝采样,重新生成才行。

代码:(优化前)

class Solution {
public:
    int rand10() {
        int a,b;
        while(1){
            a = rand7();
            if( a != 6 && a != 7 ) break;
        }
        while(1){
           b = rand7();
           if( b != 7 ) break;
        }
        if( a == 1 ){
            if( b <= 3 ) return 1;
            else return 2;
        }
        else if( a == 2 ){
            if( b <= 3 ) return 3;
            else return 4;
        }
        else if( a == 3 ){
            if( b <= 3 ) return 5;
            else return 6;
        }
        else if( a == 4 ){
            if( b <= 3 ) return 7;
            else return 8;
        }
        else {
            if( b <= 3 ) return 9;
            else return 10;
        }
    }
};

代码:(优化后)

class Solution {
public:
    int rand10() {
        while (true) {
			int num = (rand7() - 1) * 7 + rand7();
			if (num <= 40) return num % 10 + 1;
		}
    }
};

不懂??????????没关系,看第二个,更简单!!!!!!!!!!!!!!!!!

第二题(别看题目,看下面读题

读题:给一个半径 r0 和圆心坐标 x0, y0 ; 然后返回这个圆上或者圆内随机一点的坐标值(注:全是double类型,而且落在每一点上的概率必须相等

官解:两个随机函数呗,一个随机范围是 [ x0-r0, x0+r0 ] ,另一个是[ y0-r0, y0+r0 ], 只要两个随机数的平方和大于了半径 r0 就统统 “拒绝”,只计算 平方和小于半径的结果,看图: 

(这官解太low了)

这不就是撒豆子算概率问题嘛,随机生成的坐标点 x , y 就豆子的落点,这个落点只能在圆内,如果在圆外了就“拒绝”这个坐标,给我重新生成去。

(单纯是为了说明拒绝采样算法而已,此题有更佳的解法)

// 作者:力扣官方题解
class Solution {
private:
    mt19937 gen{random_device{}()};
    uniform_real_distribution<double> dis;
    double xc, yc, r;

public:
    Solution(double radius, double x_center, double y_center): dis(-radius, radius), xc(x_center), yc(y_center), r(radius) {}
    
    vector<double> randPoint() {
        while (true) {
            double x = dis(gen), y = dis(gen);
            if (x * x + y * y <= r * r) {
                return {xc + x, yc + y};
            }
        }
    }
};

最有解法:(极坐标法)

 (这字丑自己都不想看)

代码:(并没有用拒绝采样算法,但是效率上是它的两倍,拒绝采样要170ms+,但是极坐标只需要80ms)

class Solution {
private:
    double rc,xc,yc;
public:
    Solution(double radius, double x_center, double y_center) {
        rc = radius;
        xc = x_center;
        yc = y_center;
    }
    
    vector<double> randPoint() {
        double Rx = rc * sqrt( (double)rand()/RAND_MAX );
        double angle = 2 * M_PI * (double)rand()/RAND_MAX;
        return { xc + Rx*cos(angle), yc + Rx*sin(angle)};
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计

源码地址&#xff1a; github地址&#xff1a;https://github.com/Ahmednull/L2CS-Net L2CS-Net介绍&#xff1a; 眼睛注视&#xff08;eye gaze&#xff09; 是在各种应用中使用的基本线索之一。 它表示用户在人机交互和开放对话系统中的参与程度。此外&#xff0c;它还被用…

Docker 从入门到实践:Docker介绍

前言 在当今的软件开发和部署领域&#xff0c;Docker已经成为了一个不可或缺的工具。Docker以其轻量级、可移植性和标准化等特点&#xff0c;使得应用程序的部署和管理变得前所未有的简单。无论您是一名开发者、系统管理员&#xff0c;还是IT架构师&#xff0c;理解并掌握Dock…

【数据结构】栈和队列(队列的基本操作和基础知识)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​ 目录 前言 队列 队列的概念和结构 队列的…

域名转移:将腾讯云转移至阿里云

当时注册域名时&#xff0c;腾讯域云相对便宜&#xff0c;但目前阿里云在业界更加成熟&#xff0c;因此将自己申请的域名由阿里云转移至阿里云&#xff0c;并记录转移过程。 一、域名转出 进入腾讯云&#xff0c;登陆后选择控制台&#xff0c;选择我的资源–域名注册–全部域名…

【华为机试】2023年真题B卷(python)-滑动窗口最大值

一、题目 题目描述&#xff1a; 有一个N个整数的数组&#xff0c;和一个长度为M的窗口&#xff0c;窗口从数组内的第一个数开始滑动直到窗口不能滑动为止&#xff0c; 每次窗口滑动产生一个窗口和&#xff08;窗口内所有数的和&#xff09;&#xff0c;求窗口滑动产生的所有窗口…

LTPI协议的理解——1、LTPI协议的定义和结构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LTPI协议的理解——1、LTPI协议的定义和结构 定义DC-SCM 2.0 LTPI 结构GPIO通道I2C/SMBus通道Uart通道OEM通道数据通道 总结 定义 LTPI (LVDS Tunneling Protocol & Int…

单片机数据发送程序

#include<reg51.h> //包含单片机寄存器的头文件 /***************************************************** 函数功能&#xff1a;向PC发送一个字节数据 ***************************************************/ void Send(unsigned char dat) { SBUFdat; whil…

【ESP-NOW with ESP32:从多个开发板接收数据(多对一)】

【ESP-NOW with ESP32&#xff1a;从多个开发板接收数据&#xff08;多对一&#xff09;】 1. 项目概况2. 先决条件2.1 环境配置2.2 所需零件 3. 获取接收板 MAC 地址4. ESP32 发送码 &#xff08;ESP-NOW&#xff09;4.1 代码的工作原理4.2 setup&#xff08;&#xff09;4.3 …

异步处理方案

目录 1.通过promise的链式调用将异步方法变为同步执行 2.使用async及await 3.回调函数方式 4.三种方式对比 5.async及await使用的注意点 1.通过promise的链式调用将异步方法变为同步执行 function get1(){return new Promise((resolve,reject) >{console.log(执行get1接…

B端产品学习-市场调研与分析

B端产品市场调研与分析 目录&#xff1a; 为什么要做产品调研 B端产品调研对比C端产品调研 B端产品调研要怎么做 为什么要做产品调研 杰克特劳特说过&#xff1a;“成为唯一。如果不能争得第一&#xff0c;那就找到一个能够成为第一的细分&#xff0c;这就是定位的第一法则…

激发大规模ClickHouse数据加载(3/3)确保加载大规模数据的可靠性

本文字数&#xff1a;7016&#xff1b;估计阅读时间&#xff1a;18 分钟 作者&#xff1a;Tom Schreiber 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 本文是“激发大规模ClickHouse数据加载”系列文章的最后一篇&#xff1a; 激发…

【华为机试】2023年真题B卷(python)-猴子爬山

一、题目 题目描述&#xff1a; 一天一只顽猴想去从山脚爬到山顶&#xff0c;途中经过一个有个N个台阶的阶梯&#xff0c;但是这猴子有一个习惯&#xff1a; 每一次只能跳1步或跳3步&#xff0c;试问猴子通过这个阶梯有多少种不同的跳跃方式&#xff1f; 二、输入输出 输入描述…

springboot基于Java的大学生迎新系统

springboot基于Java的大学生迎新系统 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

Windows磁盘空间占用分析工具-WizTree

文章目录 WizTree作用WizTree树状分析图WizTree特点获取网址 WizTree作用 平时我们电脑用久了&#xff0c;产生很多文件&#xff0c;导致盘符空间不足&#xff0c;但是不知道那些文件占用比较多&#xff0c;这就需要磁盘空间分析工具-WizTree来分析文件占用情况 WizTree树状分…

信息网络协议基础_绪论

文章目录 交换技术基本概念电路交换电话交换网 分组交换数据报交换虚电路交换 网络体系结构新的网络技术和体系结构Delay/Disruption Tolerant Networking(DTN)如何理解间隙性&#xff1f; Software Define Networking(SDN)Future Internet ArchitectureNDN(Named Data Network…

测试C#使用OpenCvSharp从摄像头获取图片

OpenCvSharp也支持获取摄像头数据&#xff0c;不同于之前测试AForge时使用AForge控件显示摄像头数据流并从中截图图片&#xff0c;OpenCvSharp中显示摄像头数据流需要周期性地从摄像头中截取图片并显示在指定控件中。本文学习C#使用OpenCvSharp从摄像头获取图片的基本方式。  …

【算法练习】leetcode链表算法题合集

链表总结 增加表头元素倒数节点&#xff0c;使用快慢指针环形链表&#xff08;快慢指针&#xff09;合并有序链表&#xff0c;归并排序LRU缓存 算法题 删除链表元素 删除链表中的节点 LeetCode237. 删除链表中的节点 复制后一个节点的值&#xff0c;删除后面的节点&#x…

uniapp中的uview组件库丰富的Form 表单用法

目录 基本使用 #Form-item组件说明 #验证规则 #验证规则属性 #uView自带验证规则 #综合实战 #校验错误提示方式 #校验 基本使用 此组件一般是用于表单验证使用&#xff0c;每一个表单域由一个u-form-item组成&#xff0c;表单域中可以放置u-input、u-checkbox、u-radio…

Javaweb之Mybatis入门程序的详细解析

1.2 入门程序实现 1.2.1 准备工作 1.2.1.1 创建springboot工程 创建springboot工程&#xff0c;并导入 mybatis的起步依赖、mysql的驱动包。 项目工程创建完成后&#xff0c;自动在pom.xml文件中&#xff0c;导入Mybatis依赖和MySQL驱动依赖 <!-- 仅供参考&#xff1a;只…

初始Web服务器

一、web服务器 1、什么是web服务器&#xff1f; web服务器就是web项目的容器&#xff0c;我们将开发好的web项目部署到web容器中&#xff0c;才能使用网络中的用户通过浏览器进行访问。 一张图带你了解web服务器有啥作用&#xff1a; 在我的电脑上有一个已经做好的项目&#…