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 ...
随机推荐
- 长度有限制的字符串hash函数
长度有限制的字符串hash函数 DJBHash是一种非常流行的算法,俗称"Times33"算法.Times33的算法很简单,就是不断的乘33,原型如下 hash(i) = hash ...
- SublimeText更换皮肤
SublimeText是一款非常好用的文本编辑工具,官方网址http://www.sublimetext.com/. 这里介绍一下手动安装SublimeText皮肤的方法. (1)首先找一款你喜欢的皮 ...
- Json对象序列化与反序列化
如果后台的参数数对象,需要在前台传入: JS代码: //创建JS对象 var CUTTING_TABLET_MO = new Object(); CUTTING_TABLET_MO.CUTTING_T ...
- 开源 侧滑 和 Tab滑动翻页 控件
侧滑 https://github.com/jfeinstein10/SlidingMenu Tab滑动翻页 https://github.com/astuetz/PagerSlidingTabStr ...
- CorelDRAW 插件的安装和使用
CorelDRAW 是一款在中国非常受欢迎的图形软件,开放的界面和编程技术,能够对它进行二次开发制作插件,插件大抵有三种gms.cpg.exe格式,下面介绍一下这三种插件的安装和使用方法. 一.gms ...
- SpotLight的下载地址以及注册码可供参考
ToadDBASuiteforOracle_101R2.exe 试用版http://worlddownloads.quest.com.edgesuite.net/Repository/www.ques ...
- Android Studio创建项目
创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具 ...
- PHP 对数组数值进行排序,使用另一个容器
<?php /* 排序方式::事实上只需要将要循环的数组进行N次循环,然后每次取最大的一个值*/ $array = array(100,25,10,258,33,48,10,5,13,58,33 ...
- js截取所需字符串长度
//title :字符串 :interceptLength:所需的长度 function TitleThumbnail(title, interceptLength, thumbnailCharac ...
- WPF常用数据绑定控件集合
1.怎么用ListView控件把XML中的数据在界面上显示出来? <?xml version="1.0" encoding="utf-8" ?> & ...