浅析 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 9 10 1 之中取一个数
第6次从 6 7 8 9 10 1 2 之中取一个数
...
第10次从 10 1 2 3 4 5 6 之中用取一个数
1-10每一个数字在上表中都出现了7次。共同拥有70个数字,这样每一个数字被命中的概率为1/10。
这里的关键词是"命中".
第11次又一次循环,从 1 2 3 4 5 6 7 之中取一个数
第12次从 2 3 4 5 6 7 8 之中取一个数
......
依照这种方法。1-10每一个数字被命中的概率是均匀分布。而1-10次的数组,本质上是生成了全部1-10依照次序的一个轮换结构。也就是组合问题中的生成全部排列。(參见Knuth第4卷第2冊(The Art Of Computer Programming, Volume4, Generating
All Tuples and Permutations))在经过比較长的时间之后,就能够观察到均匀分布。其实,不论什么随机数算法都须要经过比較长的过程才干观察出他的分布。而概率分布。是在一个统计意义上的概念。
由此还能够得出用m个随机数生成n个随机数的方法
1. 当m > n的时候,用舍去法,每次n个随机数,超过这个范围就舍弃,再来一次。
2. 当m < n的时候,用如上的方法建立m大小的数组,当中的数字在1到n依照次序循环轮换,这样n*m个循环之后。就能够得到均匀的n个随机数。


2. 同余循环法

上面这种方法。实际上等价于(rand7() + i)%10。i从0-9重复循环。而每次计算的余数恰好与上面的方法等价。也就是用利用同余的性质生成全部排列。这真是一个巧妙的想法!

于是:

1. i从0到9重复循环
2. (rand7()+i)%10,产生0-9的随机数。等效与第一种组合法(仅仅须要把上面表中的1-10改成0-9)
3. 再+1得到1-10的随机数

优化后仅仅须要一行代码!


于是上面用m个随机数生成n个随机数的方法的,也有了更简洁的算法,步骤与此相似就不写了。


3. 舍去法

这个题在考试中大概是不让用舍去法的,由于他太平庸。

但实际上舍入法也非常实用。因此还是写出来,后面还会再提到舍入法。

1. 第一次用rand7取出1到5的随机数,记为a
2. 第二次用rand7取出1或2,记为b
3. 假设b = 1, 则c = a, 假设b = 2,则c = a + b
4. 返回c

4. . 连续随机变量的分布
本题的rand7是一个离散随机变量,仅仅取1-7的整数。

离散变量的缺点是在数学计算上不方便,因此能够转成连续随机变量。也就是从rand7生成1-7的连续均匀分布,获得1-10的均匀分布。尽管本题不适用这种方法,可是本题除了考试实用,在实际应用中不会出现,很多其它的方法是从一种分布变换到第二种分布。

如今的答案非常easy。从几何的角度上看,我们能够把[a,b]线段上的点依照一对一映射到还有一个线段[c,d]上去,仅仅须要做一个线性变换y=(x-a)/(b-a)*(d-c)+c. 那么。若rand()~U(a,b),则y=(rand()-a)/(b-a)*(d-c)+c~U(c,d)。也就是假设rand()是a到b上的均匀分布,则y=(d-c)(x-a)/(b-a)+c是c到d上的均匀分布。

对于本例rand10=(rand()-1)/6*9+1.?
这个定理还能够更强一些,f(x)是分段还是也能够。甚至仅仅是一个覆盖(包含)就能够了。从符合一种分布的随机数生成第二种分布的随机数是统计模拟的课题,当中有非常有趣的变换方法,比如,假设X是(0,1)上的均匀分布,则Y=-a*log(X)是指数分布。这些内容,參考《统计判断》,或者更进一步的材料。

5. 再谈舍入法
C语言的rand函数,可能是用了线性同余算法获得均匀分布,这类叫直接方法。舍去法也是非常重要的一类随机,用来生成各种分布的随机数,比方Metropolis算法。比較著名的还有Markov Chain Monte Carlo (MCMC)算法。这类方法能够看成是一个黑盒子。要求在算法内部通过几次运算非常快收敛到一种概率分布,然后返回一个随机数。參见Casella & Berger统计判断(Statistical
Inference)以及Kunth第2卷Seminumerical Algorithms, Random Numbers.

原文地址:https://www.cnblogs.com/zhchoutai/p/8619817.html

时间: 2024-10-12 21:53:58

浅析 rand7生成rand10 方法 之 思想篇(一)的相关文章

利用rand7()构造rand10()

题意 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10 参考代码 int rand7() { srand((int)time(NULL)); //参考 return rand()%7 + 1; } int rand10() { int x; do { x = (rand7()-1) * 7 + rand7(); }while(x > 40); return x % 10 + 1; } 解析 要保证rand10()均匀生成1~10的随机

[Swift]LeetCode470. 用 Rand7() 实现 Rand10() | 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 1: Input: 1 Output: [7] Example 2:

已知rand7()&#160;可以产生1~7的7个数(均匀概率),利用rand7()产生rand10()1~10(均匀概率)

题目:已知rand7() 可以产生1~7的7个数(均匀概率),利用rand7()产生rand10()1~10(均匀概率). 解析:首先利用rand7()产生1-5的5个数,每个数的概率为1/5,然后在这5个数的基础上再以1/2的概率加上5,这样就能以1/10的概率产生每一个数. 答案: int rand10() { int tmp1,tmp2; do { tmp1=rand7(); }while(tmp1>5); do { tmp2=rand7(); }while(tmp2>2); retur

asp.net 生成PDF方法

今天转博客园看到有人发表了一篇生成PFd的文章,准备自己也留一份准备以后用到的时候方便调用: 首先去itextsharp网站下载控件(https://sourceforge.net/projects/itextsharp) 将下载后的控件引用到自己的项目里面,主要的bll文件为:itextsharp.dll文件 1.根据DataTable生成PDF文件 添加Itextsharp引用 using iTextSharp;using iTextSharp.text;using iTextSharp.t

已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10

1.int rand7()    2.{    3.  return rand()%7+1;    4.}    5.  6.int rand10()  7.{  8.    int x=0;  9.    do  10.    {  11.        x=(rand7()-1)*7+rand7();  12.    }  13.    while(x>40);  14.    return x%10+1;  15.} 分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-1

Eclipse用法和技巧三:自动生成Main方法2

上一篇文章里面介绍了新建文件时候自动添加main方法,这里接着介绍自动联想main方法.       步骤一:输入"main” 步骤二:保持光标在上图位置,按ALT + /,再回车 上一篇文章,Eclipse用法和技巧二:自动生成Main方法1:                              http://blog.csdn.net/ts1122/article/details/8769361 下一篇文章,Eclipse用法和技巧四:生成说明文档:                  

方法与思想高于平台与语言

好久没写博客,最近经常看到关于.NET与java讨论的文章,有的文章被许多人认可,有的貌似引起了较大争议. 论Java,C# 二类开发的细节与思维 微软程序员最好的时代来了 .net 估计要死在你手里了 做为从事.NET.java等软件开发多年的开发人员,趁着新年元旦,在此也说说我个人的看法. 一.对.NET与java的一些个人肤浅体会 1. .NET与java比最大劣势,目前.NET大部分项目主要还是运行在windows系统上,windows收费,待公司走上正规.系统上规模之后就会自然弃用.N

人活着的意义---2014思想篇

一个人从小到大再到老,总是伴随着快乐并痛苦的活着. 有的人痛苦长,快乐少,命短:有的人痛苦少,快乐长,命长. 在生活中,快乐和痛苦表面看起来好像是自己的命理一样,因此很多人随着年龄的增长,慢慢的开始迷信:然而实际是什么呢? 快乐和痛苦之间实则是心灵的变化,这种变化是因一个人对生活向往的一种自我追求. 很小的时候,听了上辈人说,我们那时候生活条件多艰苦,饭都没得吃,学费更交不起,怎么可能还有条件去读书.学知识呢?!是 的,50年前,天灾人祸都被那一代的人享受尽了,那么我们就可以理解,难道在那样恶劣

浅谈 js 字符串 trim 方法之正则篇

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流