一道面试题引发的有关随机数的思考(4)

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




你可能感兴趣的:(一道面试题引发的有关随机数的思考(4))