按照上一篇文章(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等随机数。