谷歌面试题:在半径为1的圆中随机选取一点

方法1.
在x轴[-1, 1],y轴[-1, 1]的正方形内随机选取一点。然后判断此点是否在圆内(通过计算此点到圆心的距离)。如果在圆内,则此点即为所求;如果不在,则重新选取直到找到为止。
正方形的面积为4,圆的面积为pi,所以正方形内的随机点在圆内的概率是 pi / 4。

import java.util.HashMap;
import java.util.Map;

// 谷歌面试题:在半径为1的圆中随机选取一点

public class FindPointInCircle {
//    方法1.
//            在x轴[-1, 1],y轴[-1, 1]的正方形内随机选取一点。然后判断此点是否在圆内(通过计算此点到圆心的距离)。
//    如果在圆内,则此点即为所求;如果不在,则重新选取直到找到为止。
    private Map<Character,Double> solution(){
        Map<Character,Double> resMap = new HashMap<>();
        double x = Math.random()*2 - 1;
        double y = Math.random()*2 - 1;
        while(true){
            if(Math.pow(x,2)+Math.pow(y,2) <=1){
                resMap.put(‘x‘,x);
                resMap.put(‘y‘,y);
                return resMap;
            }
        }
    }

    public static void main(String args[]){
        FindPointInCircle findPointInCircle = new FindPointInCircle();
        System.out.println(findPointInCircle.solution());
    }
}

  

方法2.
从[0, 2*pi)中随机选一个角度,对应于圆中的一条半径,然后在此半径上选一个点。但半径上的点不能均匀选取,选取的概率应该和距圆心的长度成正比,这样才能保证随机点在圆内是均匀分布的。

方法2不知道咋实现,谁知道发一下呗。

概率相关的题目做的太少,在找工作呢,还是需要多练习啊。

欢迎大家交流。

原文地址:https://www.cnblogs.com/Allen-win/p/11808947.html

时间: 2024-10-10 13:40:34

谷歌面试题:在半径为1的圆中随机选取一点的相关文章

如何在半径为1的圆中随机选取一个点

拿到这个题目大部分人的第一个思路是 在x轴[-1,1],y轴[-1,1]的正方形内随机选取一点.然后判断此点是否在圆内(通过计算此点到圆心的距离).如果在圆内,则此点即为所求:如果不在,则重新选取直到找到为止. 正方形的面积为4,圆的面积为pi,所以正方形内的随机点在圆内的概率是pi/4. 如果对机器学习的算法熟悉的话,这种方法叫做拒绝性采样.就是用一种容易生成的概率分布(本题是正方形的均匀分布),去模拟不容易生成的概率. 在单位圆上模拟均匀分布,要模拟满足概率分布 f 的随机变量,其中 f 满

2013谷歌笔试题

个人信息:就读于燕大本科软件工程专业 目前大四; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2010; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 题目 写函数,输出前N个素数.不需要考虑整数溢出问题,也不需要使用大数处理算法. 思路 个人思路对每个奇数去检验是否是素数,检验

C++面试题1:构造函数和虚构函数中能否调用虚函数?

C++面试题1:构造函数和虚构函数中能否调用虚函数? 构造函数跟虚构函数里面都可以调用虚函数,编译器不会报错. C++ primer中说到最好别用 由于类的构造次序是由基类到派生类,所以在构造函数中调用虚函数,虚函数是不会呈现出多态的 类的析构是从派生类到基类,当调用继承层次中某一层次的类的析构函数时意味着其派生类部分已经析构掉,所以也不会呈现多态 因此如果在基类中声明的纯虚函数并且在基类的析构函数中调用之,编译器会发生错误. class Base { public: Base() { Fuct

创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。

编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) //创建Circle对象时将半径初始化为r ③ 三个成员方法 double getArea( ) //计算圆的面积 double getPerimeter( ) //计算圆的周长 void show( ) //将圆的半径.周长.面积输出到屏幕 编写应用程序,创建类的对象,分别设置圆的半径计算并分别显

46. 谷歌面试题:寻找丑数

题目:我们把仅仅包括因子2.3和5的数称作丑数(Ugly Number).比如6.8都是丑数,但14不是,由于它包括因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第1500个丑数. 分析:这是一道在网络上广为流传的面试题,据说google以前採用过这道题. 这段题刚開始的想法是从1開始递增遍历,找出1500个是丑数的数,并打印出来. 实现例如以下: #include<stdio.h> #include<string.h> #include<iostream&g

谷歌笔试题&mdash;&mdash;排序,只允许0和其他元素交换

2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序. 这题有一个隐含条件:即数组元素是连续的,即0--n-1,当你排好序后,你会发现数组元素和该元素的下标是相等的. 思路:以数组2 0 3 1为例 1.首先a[0]=2,按照上述条件它应该放在a[2]的位置上.因为只允许0元素和其他元素的交换.所以不能直接交换a[0]和a[2],所以将0元素和a[2]互换,得到2 3 0 1,然后就可以把a[0]=2和a[2]=0互换了,得到0 3 2 1 按照这个思

谷歌笔试题 --- 环状链表去重

编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作. 比如:1(头)->2->2->3->3->1->1(头) 去除以后的结果是1->2->3,注意头尾的1也要去掉一个. //时间复杂度为O(N) //空间复杂度为O(1) //代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <cstdl

谷歌面试题:继承关系变组合关系

题目描述 一个项目中有Employee类型,该类型是个大类型,下分为Engineer类型和Manager类型.比方一个人开始是Engineer类型,后来升职了,变成了Manager的角色,这种情况,应该如何建模更好一些. 思路 变继承关系为组成关系,方便扩展. 代码 定义一个Role的接口: public interface Role { void doWork(); } 定义Employee类型: public class Employee { private final String nam

[面试题总结及扩展知识]同一进程中的线程共享的资源

又是一道腾讯2014年的面试题: A,栈   B,数据段    C,寄存器组    D,文件描述符 这是解释以及相对应的扩展知识: 线程的共性如下: 线程共享的环境包括:进程代码段. 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯). 进程打开的文件描述符. 信号的处理器.  进程的当前目录和进程用户ID与进程组ID. 线程的个性如下: 1.线程ID     每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标识线程. 2.寄存器组的值     由于线程间是并