`

(转)随机数生成函数面试题

阅读更多

转载自:http://sumnous.github.io/blog/2014/05/13/random-pick-function/

前阵子去某公司笔试,有道题是

已知随机数生成函数f(),返回0的概率是60%,返回1的概率是40%。根据f()求随机数函数g(),使返回0和1的概率是50%,不能用已有的随机生成库函数。

分析:

调用f()两次即可,会出现4种结果(0,0), (0,1), (1,0), (1,1),其中出现(0,1), (1,0)的概率是一样的,可以构造出等概率事件,比如出现(0,1)可返回0,出现(1,0)可返回1,如果出现其他两种情况则舍掉重新调用。

代码如下:

1
2
3
4
5
6
7
8
def g():
    while(true):
        a = f()
        b = f()
        if [a,b] == [0,1]:
            return 0
        if [a,b] == [1,0]:
            return 1

这道笔试题到此为止。

接下来扩展一下,如何实现这个随机数生成函数f(),可用random(),也就是以指定概率获取元素。《Python Cookbook》中有此示例。分析一下,也就是在(0, 0.6]区间内取0,在(0.6, 1]区间内取1。扩展到多个数也一样。

1
2
3
4
5
6
7
8
9
def withProbRandomPick(probList):
    import random
    import sys
    r, s = random.random(), 0
    for num in probList:
        s += num[1]
    	if s >= r:
    	    return num[0]
    print >> sys.stderr, "Error: shouldn't get here"

验证一下:

1
2
3
4
5
6
7
probList = [[0, 0.6], [1, 0.4]]
import collections
count = collections.defaultdict(int)
for i in xrange(10000):
    count[withProbRandomPick(probList)] += 1
for n in count:
    print n, count[n] / 10000.0

得到的结果是:

1
2
0 0.5953
1 0.4047

《程序员面试金典第5版》(Cracking the Coding Interview)中也有一道给定一个随机数函数生成另一个随机数函数的题目。

给定rand5(),实现一个方法rand7()。也即,给定一个产生0到4(含)随机数方法,编写一个产生0到6(含)随机数的方法。(第105页)

分析:随机数函数的关键是确保产生每一个数的的概率相等。我们可用通过5 * rand5() + rand5()产生[0:24],舍弃[21:24],最后除以7取余数,则可得到概率相等的[0:6]的数值。

1
2
3
4
5
def rand7():
    while(true):
        num = 5 * rand5() + rand5()
        if num < 21:
            return num % 7

变形一下,给定rand7(),如何实现rand5()?

分享到:
评论

相关推荐

    C++经典50大面试题【50个C++精选面试题】

    在IT行业的面试中,C++作为一门强大的编程语言,其面试题往往涵盖了广泛的知识领域,包括基础语法、面向对象编程、模板、STL、内存管理、多线程、异常处理等。以下是一些可能出现在“C++经典50大面试题”中的关键...

    python面试题汇总(

    在面试准备过程中,了解和掌握一些常见的Python面试题对于求职者来说至关重要。以下将详细解释上述文件中提到的Python知识点。 1. 利用Python的内置函数sum()可以非常简便地计算序列的总和。例如一行代码`sum(range...

    民生银行java面试题

    民生银行 Java 面试题解析 在本文中,我们将对民生银行 Java 面试题进行详细解析,每个问题都将被拆分成多个知识点,并对每个知识点进行详细的解释。 问题 1: 班级表和学生表 SQL 语句 在这个问题中,我们需要写...

    新110道python真实面试笔试面试题.docx_python面试

    以下是 Python 面试题汇总,涵盖了 Python 的基础知识、数据结构、函数、面向对象编程、文件操作、正则表达式、随机数生成、断言、SQL 等方面。 一、Python 基础知识 * Python 的标准库包括 os、sys、re、math、...

    Python经典面试题

    - NumPy:数组操作、矩阵运算、统计函数和随机数生成。 - Pandas:数据结构DataFrame和Series,数据清洗、合并、切片和分析。 - Matplotlib和Seaborn:数据可视化,包括折线图、柱状图、散点图和直方图。 - ...

    c#面试题集锦

    C#面试题集锦 在这篇文章中,我们将讨论一些常见的C#面试题,并提供解答。这些问题涵盖了C#的基本概念、类和接口、结构体、异常处理、集合等方面。 1. const和readonly的区别 const和readonly都是用于定义常量的...

    数据分析面试题-python笔面试题汇总2.docx

    【Python数据分析面试题汇总】 1. **Python求和**:Python内置函数`sum()`可用于求和,例如`sum(range(1, 101))`将计算从1到100的所有数字的总和。 2. **全局变量修改**:在函数内部修改全局变量需使用`global`...

    最新python面试题及答案.doc

    11. **生成随机数**:使用random模块生成随机整数可以使用`random.randint(a, b)`,随机小数可以使用`random.random()`(0-1之间的浮点数)。若需要numpy库,`np.random.randn(d0, d1, ..., dn)`能生成指定形状的...

    110道Python面试题.pdf

    本资源摘要信息是关于 Python 面试题的知识点总结,涵盖了 Python 的多方面知识点,包括基本语法、函数、数据类型、面向对象、文件操作、异常处理、正则表达式、随机数生成、断言、SQL 等。 1. 基本语法 * 一行...

    前端大厂最新面试题-random.docx

    以下是一些基于给定文件中的面试题所涵盖的关键知识点: 1. **在圆内随机生成点**: 这个问题涉及到概率论和几何学。在JavaScript中,可以使用Math.random()函数生成[0,1)之间的随机数来确定点的坐标。通过将这两...

    Python面试题总结.pdf

    Python面试题总结知识点: 1. 单例模式的实现方法: Python中实现单例模式主要有两种方式。第一种是利用装饰器(decorator),创建一个全局的字典用于存储类的实例,并通过装饰器返回这个实例。如果在字典中不存在类...

    mysql面试题

    不过,每次运行这个查询,由于`RAND()`函数会生成不同的随机数,所以结果会有所不同。示例如下: ```sql SELECT * FROM emp ORDER BY RAND() LIMIT 5; ``` 第三个问题是要按部门编号(Deptno)创建一个新的列并...

    数据库面试题索引sql优化

    `DBMS_RANDOM.VALUE()`用于生成随机数,`ROWNUM`则用来限制返回的记录数。 **题目8.3:** 处理空值排序。 **解答:** ```sql SELECT * FROM EMP ORDER BY COMM DESC NULLS LAST (FIRST); ``` **解析:** 此题考查...

    python笔记50-面试题:交换圣诞节礼物.docx

    【Python面试题:交换圣诞节礼物】是一个典型的编程问题,它涉及到随机数生成、字典操作以及循环控制等Python基础知识。在此题中,我们要创建一个模拟圣诞礼物交换的游戏,确保每个人都能拿到别人送出的礼物,而不会...

    BAT经典面试题100道.pdf

    这份文件是关于BAT(百度、阿里巴巴、腾讯)公司的经典面试题集,包含了多个方面的技术问题,覆盖算法、C/C++基础、智力题以及概率题和操作系统题等。接下来我将详细解释这些知识点: ### 算法部分知识点 1. **...

    Python基础面试题(33题).pdfpython面试

    Python标准库中的random模块提供了生成随机数的功能,如random.random()可以生成一个[0,1)之间的随机浮点数。 ### 访问C语言编写的Python模块 可以通过Python的C API来访问使用C语言编写的模块,具体是使用 **Py...

    java面试题点评剖析.pdf

    Java面试题涵盖了许多核心知识点,包括数据类型转换、设计模式、程序结构设计、随机数生成、数组操作以及方法重写和重载的概念。以下是对这些知识点的详细解析: 1. **数据类型转换**: 在Java中,整数直接量可以...

Global site tag (gtag.js) - Google Analytics