Random Integer Generator
先占坑。以后再修改
昨天遇到一道题, Given int Rand(1) = 0或者 1- uniformly distributed, write a function to implement Rand(29) - uniformly distributed。
由于本科时概率没学好,挂了。回来网上一查资料发现有类似的题目 - Given Rand(5) = {1, 2, 3, 4, 5}, 求Rand(7)。
求Rand7的代码是
public static int random7() {
int val = (random5() - 1) * 5 + (random5() - 1);
return val < 21 ? val % 7 + 1 : random7();
}
思路其实是把 1 - 5的数字映射到 1-7的范围,只要是uniformly distributed就行, 我们可以不在乎这 1 - 7的概率是 4%, 2 % , 还是 1%, 只要他们相等, 多余的部分我们再舍弃掉。比如计算范围是 1 - 10
- 我们可以取 1 ,2, 3 ,4 ,5 ,6 ,7, 舍弃 8 - 10 (舍弃的方法是再call一次random函数,程序有可能死循环,但从概率上来看死循环几率极小)
- 也可以取 4, 5, 6, 7, 8, 9, 10,舍弃 1 - 3, 但计算答案的时候 return val - 3
以上代码是一个解,我们还可以有其他的解。 比如以下,
public static int random7() {
int val = (random5() - 1) + (random5() - 1) * 5 + (random5() - 1) * 25;
return val < 119 ? val % 7 + 1 : random7();
}
原理就是,只要把random5()得到的数字均匀映射到一串大于7的连续数字里。
所以回到这个题目,Given rand(1)实现 rand(29),其中 rand1() = 0 或者 1,每次只有两个数,所以我们可以使用以下代码来映射到0 - 31, 再舍弃30 和31就可以了:
public static int rand29() {
int val = rand1() + rand1() * 2 + rand1() * 4 + rand1() * 8 + rand1() * 16;
return val < 29 ? val: rand29();
}
2/25/2016
今天又看到有一个公式,假如给定m 和 n以及一个rand(1),那么求一个在m到n中间的数,可以用 rand(1) * (n - m) + n。这里题目不要求uniform distribution的话好像也可以这么做。
Reference:
http://www.growingwiththeweb.com/2014/03/given-random5-implement-random7.html
http://www.careercup.com/question?id=12426697
Random Integer Generator的更多相关文章
- 文献翻译|Design of True Random Number Generator Based on Multi-stage Feedback Ring Oscillator(基于多级反馈环形振荡器的真随机数发生器设计)
基于多级反馈环形振荡器的真随机数发生器设计 摘要 真随机数生成器(trng)在加密系统中起着重要的作用.本文提出了一种在现场可编程门阵列(FPGA)上生成真随机数的新方法,该方法以 多级反馈环形振荡器 ...
- react random key generator;react如何产生随机不重复的key
1.<div key={+new Date() + Math.random()}> 2.使用数组的索引 3.使用uuid:https://www.npmjs.com/package/uui ...
- Random Number Generator
rand()函数可以产生[0,RAND_MAX]之间的均匀的伪随机数,它定义在头文件stdlib.h中,函数原型: int rand(void); C标准库的实现是: unsigned ; /*ran ...
- 【Codechef】Random Number Generator(多项式除法)
题解 前置技能 1.多项式求逆 求\(f(x)\*g(x) \equiv 1 \pmod {x^{t}}\) 我们在t == 1时,有\(f[0] = frac{1}{g[0]}\) 之后呢,我们倍增 ...
- @codechef - RNG@ Random Number Generator
目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @accepted code@ @details@ @description@ ...
- [spojRNG]Random Number Generator
先将所有数加上Ri,即变为区间[0,2Ri],考虑容斥,将区间容斥为[0,+oo)-[2Ri,+oo),然后对[2Ri,+oo)令$bi=ai-2Ri$,相当于范围都是[0,+oo)问题转化为求n个正 ...
- python的random模块
As an example of subclassing, the random module provides the WichmannHill class that implements an a ...
- ISO C Random Number Functions
This section describes the random number functions that are part of the ISO C standard. To use these ...
- Prefer ThreadLocalRandom over Random
Java 7 has introduced a new random number generator - ThreadLocalRandom Normally to generate Random ...
随机推荐
- Mac OS X安装OpenCV 3.1.0
在我的上一篇文章“”中已经介绍了Linux下OpenCV的安装配置方法,在这里仅仅记录Mac上相对于Linux的一点点差异. 1. 安装依赖包 Mac上安装软件包使用的工具是brew,用此来替代Ubu ...
- 鼠标滑过提示title
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1. ...
- Oracle管理基础
1.exp导出命令
- Mac下使用Web服务器性能/压力测试工具webbench、ab、siege
Web开发,少不了的就是压力测试,它是评估一个产品是否合格上线的基本标准,下面我们来一一剖析他们的使用方式. 测试前,前面先把系统的端口限制数改大,看看Mac下面的默认限制 ulimit -a ope ...
- jquery 点击查看,收起特效
<div class="all"> <p><a href="javascript:;" id="onvk"&g ...
- Java http post
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- [旧博客]QQ旋风加速漏洞
漏洞是这样的,用开通QQ会员的账号登录QQ旋风,添加要下载的任务,启动加速后,注销,登录lixian.qq.com 删除刚才添加的离线任务,这时QQ旋风还是在加速那个任务.而你又可以登录QQ旋风添加其 ...
- 在MVVMLight框架的ViewModel中实现NavigationService
网上已经有很多方法了,比如通过Messenger来实现等等.这里我只讲述一种我比较喜欢的方法,因为它很方便 首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类.在基类中定义 ...
- ThinkPHP I方法
ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话,可以直接参考使用3.1快速入门教程系列的变量部分. 概述 正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新 ...
- C#学习笔记---基础入门(二)
枚举 枚举是被命名的整型常数的集合:枚举类型的变量只有赋值后才能使用:不同枚举中的枚举值可以重名:可以自定义枚举值. enum Playstates { 跑, 跳,下滑,左转,右 ...