Summary: rand5构造rand7

给一个方法,比如 rand5(), 它能够等概率生成 1-5 之间的整数。 所谓等概率就是1,2,3,4,5 生产的概率均为 0.2 。现在利用rand5(), 构造一个能够等概率生成 1- 7 的方法。

这里有两个特别重要的点,一是 如果 rand5() + rand5(), 我们能够产生一个均匀分布的1 - 10 吗? 答案是否定的。比如对于 6来讲(4+2, 2+4, 3+3),它被生成的生成的概率比1 (1+0,0+1)要大.

第二个点就是我们不可能用rand5()直接产生 1- 7 的数,不管你用加减乘除都不行。

所以,我们要构造一个更大的范围,使得范围里每一个值被生成的概率是一样的,而且这个范围是7的倍数,代码如下:

1 int rand7() {
2         while (1) {
3                 int rand = 5 * (rand5() -1) ;
4                 rand = rand + rand5() -1;
5                 if (rand < 22 && ran > 0) {
6                              return rand%7 + 1 ;
7                 }
8          }
9 }

今天还问了TCP closing 的问题,对方肯定是想要知道Time Wait流程

时间: 2024-08-02 23:11:02

Summary: rand5构造rand7的相关文章

算法题--rand5产生rand7

由一个随机数产生另外一个随机数,最关键的问题是,如何实现等概率映射? 下面是我的rand5产生rand7的实现: 主要思路是将rand5映射到rand(5~30),然后抛去多余的几个,将剩下的21个数每三个映射到1~7之间得数. 1 #include <iostream> 2 #include <string> 3 #include <memory.h> 4 #include <vector> 5 #include <sstream> 6 #in

一道随机函数题:由rand5()生成rand7()

题目:已知rand5()函数能随机等概率的生成0, 1, 2, 3, 4,利用rand5()函数编写一个rand7()函数实现相似的功能. 分析:其实就是利用rand5()组合成一个更大范围的数,之后利用求余(%)再映射到0-6之间. Java代码: int rand7() { //已知rand5()产生0,1,2,3,4,求rand7() int a; do { a = 5*rand5() + rand5(); //产生0-24 } while (a > 20); //只取0-20 retur

由随机数rand5实现随机数rand7

rand5表示生成随机数1,2,3,4,5 rand7表示生成随机数1,2,3,4,5,6,7 要通过rand5构造rand7现在可能没有什么思路,我们先试着用rand7生成rand5 rand7生成rand5很简单,把6和7排除掉就是rand5了,也就是当随机到大于5的时候,就再随机一次,直到小于等于5 代码写起来很容易 public static int rand5(){ Random ra =new Random(); int result = ra.nextInt(7)+1; while

【算法】如何用随机函数rand5来构造随机函数rand7

常规方法 今天公司有一个面试题是这样的:假如有一个函数rand5能等概率生成1 - 5 之间的整数,如何利用rand5来实现rand7?rand7函数的要求是能够等概率生成1 - 7之间的整数.说实话我自己也不是很清楚. 这个问题很经典的.carreercup那本书上有个常见的解法,我记得算法大概是这样的,用PHP写写吧: 01 echo 'rand7 = '.rand7(); 02   03 function rand7() 04 { 05     while (true) 06     {

【C#进阶系列】28 基元线程同步构造

多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗漏,而且锁会损耗性能,获取和释放锁都需要时间,最后锁的玩法就在于一次只能让一个线程访问数据,那么就会阻塞线程,阻塞线程就会让额外的线程产生,阻塞越多,线程越多,线程过多的坏处就不谈了. 所以可以避免线程同步的话就应该去避免,尽量不要去使用静态字段这样的共享数据. 类库和线程安全 .net类库保证了所

利用等概率Rand5产生等概率Rand3

转自http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.gocalf.com%2Fblog%2Funbalanced-coin.html 利用等概率Rand5产生等概率Rand3 问题本身很明确,但不知道起个什么题目好,姑且先这么说吧. 问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使用任何能产生随机数的函数或数据源),生成等概率的[0, 3)范围内的随机整数. 我

小议随机数

C语言中可以使用rand()函数来生成一个从0到RAND_MAX的uniform分布.而rand()函数一般是用线性同余法来实现伪随机. 线性同余法 线性同余方法(LCG)是个产生伪随机数的方法. 它是根据递归公式: 其中是产生器设定的常数. LCG的周期最大为,但大部分情况都会少于M.要令LCG达到最大周期,应符合以下条件: 1.   互质: 2.   的所有质因数都能整除: 3.   若是4的倍数,也是: 4.   都比小: 5.   是正整数. C语言中rand()就是利用这个公式,由于这

随机数生成问题

给定随机生成整数1到5的函数,写出能随机生成整数1到7的函数 方法1: rand5()*5+rand5(),得到[6,30]区间内25个数等概率分布 可以只用6~26之间的21个数,映射到1~7这7个数 27~30怎么办?抛弃掉 int rand7() { int i; while((i=rand5()*5+rand5())>26); return (i-3)/3; } 这样生成的1~7概率均匀,只是其和不等于1 方法2: 用rand5()生成一个5进制的数 假如有3位,那么每一位生成一个ran

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我