一道面试题引发的有关随机数的思考(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等随机数。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值