按照上一篇文章(http://blog.csdn.net/xzjxylophone/article/details/6835454)中的思路我们来实现Rand10和Rand12
以下是类Rand10_3
public class Rand10_3:Rand7Base
{
private Rand10_3()
{
_maxNum = 10;
}
public static Rand10_3 GetInstance()
{
if (rand == null || !(rand is Rand10_3))
{
rand = new Rand10_3();
}
return (Rand10_3)rand;
}
override public int Next()
{
int result = 0;
int num = _rand7.Next();
while (true)
{
int n = _rand7.Next();
if (n == 1)
continue;
if(n > 4)
{
result = num;//1,2,3,4,5,6,7
}
else
{
//num=4,5,6,7的时候重新计算
if(num > 3)///代码块1
{
result = Next();
}
else
{
result = num + 7;//8,9,10
}
}
break;
}
return result;
}
}
以下是测试Rand10_3的结果:
计算Rand10_3的概率如下
产生1的概率是:0.1000994
产生2的概率是:0.0999704
产生3的概率是:0.1001087
产生4的概率是:0.0999333
产生5的概率是:0.0998858
产生6的概率是:0.0999692
产生7的概率是:0.1000680
产生8的概率是:0.1000786
产生9的概率是:0.0998536
产生10的概率是:0.1000330
耗时: 3.85888727880656 秒
Average:0.1000000;Max:0.1001087;Min:0.0998536
Max:0.1001087, Max-Average:0.0001087, Bits:0.1087000%
Min:0.0998536, Min-Average:-0.0001464, Bits:-0.1464000%
理论分析1,2,3,4,5,6,7的概率为P(1)=1/14 + 1/14 * 4/14 + .... + 1/14 * pow(4/14, n) = 1/14 * (1 - pow(4/14, n) / (1 - 4/14) = 1/14 / 10/14 = 1/10
类似的Rand12_3
只需要在代码块1 修改成num>5
现在都是实现的小于14的数,朦朦胧胧中有种感觉在49以内的数都是可以用类似的方法去实现。到底是什么了?下一篇文章我将试着是否可以写出类似Rand35,Rand34,Rand19等随机数。