LintCode 1496: Implement Rand10() Using Rand7() (随机数生成好题)

IEC 61851-24:2023 电动汽车导电充电系统 - 第24部分:直流电动汽车供电设备与电动汽车之间的数字通信,用于控制直流充电 - 完整英文电子版(110页) IEC 61851-24:2023 与 IEC 61851-23 共同适用于直流电动车供电设备与电动道路车辆(EV)之间的数字通信,用于控制导电直流电力传输,额定电源电压最高可达1000伏交流电或最高1500伏直流电,额定输出电压最高可达1500伏直流电。 立即下载

1496. Implement Rand10() Using Rand7()

Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a function rand10 which generates a uniform random integer in the range 1 to 10.

 

Do NOT use system's Math.random().

 

Example

Example 1:

 

Input:1

Output:[7]

Example 2:

 

Input:2

Output:[8,4]

Example 3:

 

Input:3

Output:[8,1,10]

Challenge

What is the expected value for the number of calls to rand7() function?

Could you minimize the number of calls to rand7()?

Notice

rand7` is predefined.

Each testcase has one argument: n, the number of times that rand10 is called.

这题不难但是很容易错!

解法1:

用两次rand7(),第1次先在0, 7, 14, ..., 42之间取,相当于取间隔。第2次在第一次的基础上加上rand7()。

这样生成的sum就是在1..49之间均匀分布的随机数。然后将其截取到1..40,返回(sum-1)/4+1,即1..4返回1, 5..8返回2,...,37..40返回10。

// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7
class Solution :public SolBase {
public:
    int rand10() {
        int a, b, sum;
        do
        {
            a = rand7() - 1;
            b = rand7();
            sum = a * 7 + b;
        } while(sum > 40);

        return (sum - 1) / 4 + 1;
    }
};

下面是我之前的做法。后来发现不对。
先调用1次rand7(),然后再调用1次rand7(),看其返回值是不是在1..4之间,若否则继续循环,否则将2次rand7()的返回值加起来。为什么第2次rand7()要看是不是在1..4之间而不是1..3之间呢,因为我们要把第2次rand7()的值减去1,对应到0..3,这样,sum1+sum2-1才对应到1..10。不然就是2..10了。

为什么不对呢?因为这是两个均匀随机变量rand1_7()和rand1_3()的和,结果会倾向于正态分布而不是均匀分布。比如说结果1只有(1,1)这一种可能性,结果6有(4,2),(5,1),(3,3)这3种可能性,结果4有(1,3),(3,1)(2,2)这3种可能性,结果9有(7,2),(6,3)这2种可能性,结果10只有(7,3)这1种可能型。

// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7
class Solution :public SolBase {
public:
    int rand10() {
        int sum1 = 0, sum2 = 0;
        sum1 = rand7();
        while ((sum2 = rand7()) > 4) continue;
        return sum1 + sum2 - 1;
    }
};

 

网上看到几种解法,感觉不对。
1)

int rand10() {
return (rand7() + rand7() ) % 10 +1; 
}

这里的结果并不是在1..10上均匀分布。比如返回1的情况只有5+5这1种,概率p=1/49.
返回3的情况有1+1, 6+6这2种,概率p=2/49.
2)

    int rand10() {
         int num = rand7() * 10;
         return num / 7;
    }

这里的结果只会在1,3,4,5,7,8,10上分布。
3)

    int rand10() {
        while (true) {
            int x = rand7();
            int y = rand7();
            int prod = x * y;    
            if (prod > 40) continue;
            return (prod % 10) + 1;
        }
    }

这里的prod也不会在1..49上均匀分布。比如说31根本取不到,而12会取到很多次。12=3*4=4*3=2*6=6*2。
 

Linux下的段错误(Segmentation fault)产生的原因及调试方法(经典) 立即下载

相关推荐

大数据 DataX-Web 详细安装教程

大数据 DataX-Web 详细安装教程

GG Bond 的博客 1万+

Implement Rand10() Using Rand7()

1. 解析 题目大意,利用提供的rand7(),实现一个rand10()的函数,使其能随机产生[1, 10]范围内的数字,即每个数字都是等概率出现的。 2. 分析 像类似的这种题,基本上都会涉及数学定理的。参考了@Grandyang的求解思路,写的很清晰~ 我们可以稍微写几个例子: ①已知rand2(),实现rand4(),可以利用 (rand2() - 1 )* 2 + ran...

Czyaun的博客 276

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 604

leetcode:Implement Rand10() Using Rand7()

Implement Rand10() Using Rand7() 题目:给定一个产生1-7的随机数的方法Rand7(),写出一个产生1-10的随机数的方法 分析:第一种想法是我们将两次随机结果相加扩大范围,然后选择10个某些等概率的组合映射到1-10输出问题是如果只选择单个组合,比如x = rand7()-1,y=rand7(),当且仅当x=0,y=1时输出1。这样只有10∗(1/7)∗(1/7)...

weixin_32931837的博客 460

win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结

之前安装过一次VMware虚拟机,后来由于某些已遗忘原因把它卸载了,但是没有卸载完全,为以后安装留下了一些麻烦,现在根据我google很多内容总结后写下了自己的解决办法。 一些我搜的的可以用的VM12的注册码 5A02H-AU243-TZJ49-GTC7K-3C61N ZZ510-DYX47-48ERP-D6XZG-YCKU2 YV5MU-2FX5H-M841P-LZX5X-PYHX8

Jeason的博客 2万+

2025-03-21(DS复习): Databricks 的技术架构

Databricks 的技术架构以 ​为核心,构建了一套高度集成、可扩展且支持多云环境的统一分析平台。其架构设计注重存储与计算的深度融合,并通过丰富的服务层功能简化了数据工程、机器学习和数据科学的工作流。

baidu_24377669的博客 1427

【每天学点算法题10.16】由rand7()生成rand10()

题目描述:给你一个函数rand7(),它可以等概率地生成1~7之间的随机数,使用这个函数rand7(),生成一个函数rand10(),使其能够等概率地生成1~10之间的随机数。 解决办法:舍去法。我们知道rand7()等概率地生成1~7之间的数,而rand10()等概率地生成1~10之间的数,rand7()没法生成8,9,10。但是如果我们有rand10()函数如何生成rand7()呢?一个很直

dyoyo90的专栏 1555

【深度学习|多实例学习】多实例学习(Multiple Instance Learning, MIL)的起源、发展和应用,附代码(一)

【深度学习|多实例学习】多实例学习(Multiple Instance Learning, MIL)的起源、发展和应用,附代码(一)

2401_89898861的博客 1918

已知rand7(),求rand10().

已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。 根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。 怎么从49平均概率的转换为1到10呢? 方法是: 1.ra

imcdragon的专栏 4736

视图库对接系列(GA-T 1400)一、简单介绍

GA/T 1400《公安视频图像信息应用系统》 是我们需要参考看看的相关文档,里面有对应的标准和介绍,没有这个文档的话可以加群找我要。群的话 我放在最下面了。我们先简单想几个问题, 也就是这个协议主要干什么用的,为什么要有, 能做什么。

qq_37716298的博客 4283

1.为什么要学习MATLAB

学习MATLAB

FPGA/MATLAB学习教程/源码/项目合作开发 5804

How do you design a rand7 function

How do you design a rand7 function using a rand5 function? My solution is: def rand7(): n = rand5() + rand5() + rand5() + rand5() + rand5() + rand5() + rand5() + rand5()

screaming的博客 574

大数据Alluxio面试题及参考答案

Alluxio 在大数据生态里的定位是作为数据编排层,能在不同计算框架和存储系统之间起到桥梁的作用。它的核心功能在于加速数据访问,让大数据应用能够更高效地使用数据。Alluxio 把数据存储和数据处理分离开来,使计算框架可以在不考虑底层存储细节的情况下访问数据,这样就提高了系统的灵活性和可扩展性。Alluxio 和 HDFS 既存在关联又有区别。从关联方面来看,HDFS 是一种广泛使用的分布式文件系统,很多大数据应用都将其作为主要的数据存储系统。Alluxio 可以和 HDFS 集成,把 HDFS 当作底层

大模型大数据攻城狮的专栏 860

由随机函数rand7构造rand10

【试题描述】 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10()随机1~10。 【试题分析】 1)要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。

云中孤鹜专栏 6876

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

470. Implement Rand10() Using Rand7() (拒绝采样Reject Sampling)

1. 问题 已提供一个Rand7()的API可以随机生成1到7的数字,使用Rand7实现Rand10,Rand10可以随机生成1到10的数字。 2. 思路 简单说: (1)通过(Rand N - 1) % 10 + 1的方法,可以求出Rand10,当N是10的倍数的时候。 (2)用( Rand7 - 1 ) * 7 + Rand7可以随机生成1-49,记作Rand49。 (3)如果可以通过Rand...

weixin_30617737的博客 180

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【LeetCode】470. Implement Rand10() Using Rand7() 解题报告(Python & C++)

【LeetCode】470. Implement Rand10() Using Rand7() 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.me/ 题目地址:https://leetcode.com/problems...

负雪明烛 2640

Implement Rand10() Using Rand7() 用 Rand7() 实现 Rand10()

已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。 不要使用系统的 Math.random() 方法。 示例 1: 输入: 1 输出: [7] 示例 2: 输入: 2 输出: [8,4] 示例 3: 输入: 3 输出: [8,1,10] 提示: rand7 已定义。 传入参数: n...

qq_26410101的博客 389

[LeetCode 470] Implement Rand10() Using Rand7()

题目 Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a function rand10 which generates a uniform random integer in the range 1 to 10. Do NOT use system’s Mat...

wlhwaii的博客 995

470. Implement Rand10() Using Rand7()

Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a function rand10 which generates a uniform random integer in the range 1 to 10. Do NOT use system's Math.ra...

学习应该是一个长链接 1056

leetcode470+rand7来进行rand10,概率数学

https://leetcode.com/problems/implement-rand10-using-rand7/description/ class Solution { public: int rand10() { int a = rand7(), b= rand7(); while(true){ if(b<=4) ...

小堃哥的专栏 1157

LeetCode 470. Implement Rand10() Using Rand7()

题解 这题关键在于创造的随机数分布要均衡。 先看这个比较trick的解法。 int rand10() { int i,j; while( (i=rand7())<6 );// 让i分布于 6 or 7 则P(i=6 or 7)=0.5 while( (j=rand7())>5 );// 让 j 分布于 1-5 则P(j=1:5) = 0....

蟋蟀的博客 305

Design Pattern(7)-Composite Pattern

适用场景组合模式适用于树形结构。试想一个公司的所有员工,肯定有上下级关系,除了最底层的员工,其他员工都有自己的领导和自己管理的员工。Composite Pattern通过让每个非最底层员工持有自己的直接下属,从而实现这种树形结构。 因为公司的每个员工都具有一些共性,所以为他们设计一个公共父类或者接口,譬如Component或者叫Employee。但是最低层员工和非最底层员工有一些区别,因为最底层员

wind_dt博客 535

浅析 rand7生成rand10 方法 之 思想篇(一)

【问题描述】 rand7是一个能生成1-7的随机数。要求利用rand7生成1-10的随机数。 【算法思想】 1.组合数学方法 第1次 1 2 3 4 5 6 7 之中用rand7取一个数 第2次从 2 3 4 5 6 7 8 之中取一个数 第3次从 3 4 5 6 7 8 9 之中取一个数 第4次从 4 5 6 7 8 9 10 之中取一个数 第5次从 5 6 7 8

稚枭天卓 4677

由1-7的随机整数函数构造1-10随机整数函数

题目: 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。 分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10

ljsspace的专栏 1万+
上一篇: LintCode 1060: Daily Temperatures (单调栈经典题)
下一篇: LintCode 1897: Meeting Room III (扫描线法,累加数组)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值