首先,大家对概率要有一定的了解,个人觉得程序员不搞点数学,就像walking dead 中的ghost,一点灵魂都没有。 给定 了1--5的随机数,且是均匀分布的。要扩展成1--7的均匀分布的随机数。不要用乘法或者除法,这样就不均匀了。思路就是用加法。在1--5随机数都加上一个数,然后这个范围也是均匀的。但不要异想天开说是在1--5随机数上+2就可以了,那只是生成了3--7之间的均匀分布。那就说说我的想法吧。总体想法是+,不用乘和除。
分别计算出1--5与1--7共有多少个间隔,就是说1--2这间为一个 间隔,那么的话1--5有4个间隔,1--7有6个间隔。 然后求出4与6的最小公倍数(注:至于用程序实现,自己想想就知道了)。4与6的最小公倍数为12.
接下来就是在1--5的随机数,记作A1;然后接着在1--5之间生成一个随机数,加上一个4(注:4是指的是1--5的空格数)记作A2,这样的话就生成了一个5--9的均匀的随机数;再生成一个1--5的随机数,然后+8,记作A3,这样生成了9--13的均匀 随机数。
上面为什么要求最小公倍数,就是让1--13之间的间隔为12.
然后生成了3种随机 数,假设为A1:1<=A1<5
A2: 5<=A2<9
A3: 9<=A3<13
比较 A1,与A2-4与A3-8的大小,按大小排序,假设最大的是A2-4,那么的话A2作为要选取的数,如果是A1,那么A1为选取的数据,如果是A3-8,那么A3为选取的数。
现在就有两种情况了,假设选中的数为B(B∈(A1,A2,A3))。
一种是1<=B<=7,那么直接输出B为随机数。
另一种是B>7,那么输出B-6为随机数。解决了所有问题。
这可以用数学理论证明是生成的数是均匀分布的。
证明我只提一点,1--5是均匀分布,5--9是均匀分布,9--13是均匀分布,现在问题来了,怎么让1--13也是均匀分布呢?这里面用的技巧是比较这间隔之间数据的大小。1--5与5--9与9--13之间是独立同分布的,那么的话就有理由认为1--5与(5--9)-4与(9--13)-8的数成为最大数的概率都是是1/3.那么就可以说是1/3的概率选取了1--5,1/3的概率选取了5--9,同样1/3选取了9--13的数。那样的话1--13就是均匀分布了。把1--13变成两个间隔,1--7和7--13,然而1--7是均匀分布,而且7--13也是均匀分布。那么的话(7--13)-6也是均匀分布,这不就是1--7的均匀分布吗?
程序就不写了,这几天都写成了腰间盘突出,就差点吐血了。