首页 > 其他分享 >470. 用 Rand7() 实现 Rand10()

470. 用 Rand7() 实现 Rand10()

时间:2023-07-01 17:22:17浏览次数:57  
标签:硬币 int Rand10 0.4 rand7 470 均匀 0.6 Rand7

 

难度中等

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

你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。

每个测试用例将有一个内部参数 n,即你实现的函数 rand10() 在测试时将被调用的次数。请注意,这不是传递给 rand10() 的参数。

 

示例 1:

输入: 1
输出: [2]

示例 2:

输入: 2
输出: [2,8]

示例 3:

输入: 3
输出: [3,8,10]

 

 

 

概率生成问题是一种比较常见的面试题,常见题型举例:

有一枚不均匀的硬币,要求产生均匀的概率分布
有一枚均匀的硬币,要求产生不均匀的概率分布,如 0.25 和 0.75
利用 Rand7() 实现 Rand10()

不均匀硬币,产生等概率
现有一枚不均匀的硬币 coin(),能够返回 0、1 两个值,其概率分别为 0.6、0.4。要求使用这枚硬币,产生均匀的概率分布。即编写一个函数 coin_new() 使得它返回 0、1 的概率均为 0.5。


// 不均匀硬币,返回 0、1 的概率分别为 0.6、0.4
int coin() {
return (rand() % 10) > 5;
}
统计抛两次硬币的结果的概率分布:

结果 0 1
0 0.6*0.6=0.36 0.6*0.4=0.24
1 0.4*0.6=0.24 0.4*0.4=0.16
不难发现,连续抛两枚硬币得到 0 1 和 1 0 的概率分布是相同的。因此这道题的解法就是连续抛两次硬币,如果得到 0 1,返回 0;如果得到 1 0,返回 1;如果两次结果相同,则重新抛。

以此类推,无论这枚不均匀硬币的概率是多少,都可以用这种方法得到等概率的结果。

代码如下:


int coin_new() {
while (true) {
int a = coin();
if (coin() != a) return a;
}
}

 

 

 

 

一、大随机数生成小随机数 : rand7()实现rand5()

如果X大于Y,例如通过rand7()实现rand5(),rand7可以等概率的生成1-7,这里面包含了1到5。我们可以直接舍弃6和7来实现随机生成1至5(如下代码),那么有一个问题,这样的rand5生成的每个数是等概率的吗?

int rand5() {
    while (true) {
        int a=rand7();
        if (a<=5) return a;
    }
}



 

(randX() - 1)* Y + randY() 可以等概率的生成[1, X * Y]范围的随机数
 
# The rand7() API is already defined for you.
# def rand7():
# @return a random integer in the range 1 to 7

class Solution:
    def rand10(self):
        """
        :rtype: int
        """
        while 1:
            a = (rand7() -1 )*7  + rand7()  #[0,6] * 7 + [1,7] = [1,49]
            if a<=40:
                return a%10+1    
            a = a - 40 # [1,9]
            a = (a -1 )*7 + rand7() #[0,8]*7 + [1,7] = [1,63]
            if a <= 60:
                return a%10+1
            a = a - 61 #[1,3]
            a = (a -1)*7 + rand7() #[0,2]*7 + [1,7] = [1,21]
            if a<=20:
               return a%10+1

 

 

标签:硬币,int,Rand10,0.4,rand7,470,均匀,0.6,Rand7
From: https://www.cnblogs.com/zle1992/p/17519569.html

相关文章

  • uva 12470(矩阵快速幂)
    题意:公式f(n)=f(n-1)+f(n-2)+f(n-3),给出n,f(1)=0,f(2)=1,f(3)=2,要求得出f(n)。题解:普通的矩阵快速幂模板题。#include<stdio.h>#include<string.h>constintMOD=1000000009;structMat{longlongg[3][3];}ori,res;longlongn;Matmultiply(......
  • Dell E7470 升级双系统
    准备1.京东购买ONEDA4芯电池 179元2.京东购买2根三星16GDDR4内存条3.京东购买1TSSD(M.2接口(NVMe协议PCIe4.0×4)KC3000)总共花费:1306准备2个16GU盘制作Windows镜像1.下载DellOSRecoveryTool 并安装2.打开DellOSRecoveryTool并安装镜像  ......
  • Thinkpad-t470电脑 Hackintosh 黑苹果efi引导文件
    原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔)硬件型号驱动情况主板Thinkpad-t470处理器[email protected]/3.4GhzTurbo已驱动内存16GBDDR42666Mhz(SKHynix)已驱动硬盘IntelSSDPro7600P512GBNVME已驱动显卡IntelHDGraphics520已驱动声......
  • GD32F470II芯片LVGL不同驱动方式对比
    1、硬件对比屏幕尺寸:800*480 颜色格式:RGB565一帧数据:800*480*2=768000=750kLCD频率:32MHz/768000=41HZlvglfps:33优化等级:AC5-O3新硬件:GD32F470IISDRAM:32bit带宽,120MHzMCU:240MHz,768KRAM,2MFlashlv_demo_b......
  • 2-211-(LeetCode-470) 用 Rand7() 实现 Rand10()
     1.题目 https://leetcode.cn/problems/implement-rand10-using-rand7/submissions/425373186/ 2.解法 classSolutionextendsSolBase{publicintrand10(){inttemp=40;while(temp>=40){temp=(rand7()-1)*7......
  • DS4700/DS4800 存储巡检
    DS4800——(M02,连B控1口)192.168.128.100ping192.168.128.102DS4700——(O07,M04)port1B控192.168.128.102/241.安装点击0035.exe,简体中文(ok),next,next,accept(next),选择路径(next),Typical(next),Automaticallystartmonitor(next),install,Done2.连接3.查看......
  • leetcode-1470-easy
    ShuffletheArrayGiventhearraynumsconsistingof2nelementsintheform[x1,x2,...,xn,y1,y2,...,yn].Returnthearrayintheform[x1,y1,x2,y2,...,xn,yn]......
  • [luogu P4705玩游戏] 题解
    P4705玩游戏题解题意概括给出两个序列\(a_0,a_2,\cdotsa_{n-1}\),\(b_0,b_2,\cdotsb_{m-1}\),从两个序列中各等概率的选出两个数\(a_i,b_j\),对于\(k\in[1,t]\)......
  • 【题解】P4707 重返现世
    隔壁友校的初一已经开始做这种题了,准老年选手感到恐惧。思路Min-Max容斥。首先考虑到\(|n-k|\leq10\),感觉有大力做法,考虑用Min-Max容斥求期望。设全集\(U\)......
  • acwing 4700. 何以包邮?
    acwing4700.何以包邮?水一期题目描述新学期伊始,适逢顿顿书城有购书满$x$元包邮的活动,小$P$同学欣然前往准备买些参考书。一番浏览后,小$P$初步筛选出$n......