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

上一篇文章(http://blog.csdn.net/xzjxylophone/article/details/6853802)中末尾我们提出可以换成其他的随机数来计算。

看以下的类:

RandSSN:

public class RandSSN : Rand
{
	private int _baseNum;//表示是以几为基础
	public int BaseNum
	{
		get
		{
			return _baseNum;
		}
	}
	private Random _rand;
	private RandSSN(int baseNum, int maxNum)
	{
		_rand = new Random();

		UpdateMaxNum(baseNum, maxNum);
	}
	private NumAnalyse na;
	public void UpdateMaxNum(int baseNum, int maxNum)
	{
		_baseNum = baseNum;
		_maxNum = maxNum;
		na = new NumAnalyse(_baseNum, maxNum);
	}
	public static RandSSN GetInstance(int baseNum, int maxNum)
	{
		if (rand == null || !(rand is RandSSN))
		{
			rand = new RandSSN(baseNum, maxNum);
		}
		else if (rand is RandSSN && rand.MaxNum != maxNum || ((RandSSN)rand).BaseNum != baseNum)
		{
			((RandSSN)rand).UpdateMaxNum(baseNum, maxNum);
		}
		return (RandSSN)rand;
	}
	private int SubNext()
	{
		return _rand.Next(1, _baseNum + 1);
	}
	override public int Next()
	{
		int result = 0;
		NumAnalyse tempNa = new NumAnalyse(_baseNum);
		int num = SubNext() - 1;
		bool preEqual = true;
		for (int i = 0; i < na.NumList.Count; i++)
		{
			if (num > na.NumList[i] && preEqual)
			{
				result = Next();
				break;
			}
			else
			{
				tempNa.NumList.Add(num);
				if (preEqual)
				{
					preEqual = (num == na.NumList[i]);
				}
				num = SubNext() - 1;
			}
		}
		return result != 0 ? result : tempNa.GetReaNum;
	}
}

测试代码:

static void TestRandSSN()
{
	RandSSN rand = RandSSN.GetInstance(10, 101);
	TestRand(rand);
}

测试结果:

耗时: 38.6652701893819 秒
Average:0.0099010;Max:0.0099880;Min:0.0098261
Max:0.0099880, Max-Average:0.0000870, Bits:0.8788000%
Min:0.0098261, Min-Average:-0.0000749, Bits:-0.7563900%

在此关于随机数的一系列的遐想就到此结束了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值