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




当谈到C++中的随机数面试题时,以下是一些常见的问题和答案: 问题1:如何在C++中生成随机数? 答案:在C++中,可以使用标准库中的`<random>`头文件来生成随机数。通常使用以下步骤: - 创建一个随机数引擎对象,如`std::default_random_engine`。 - 选择合适的随机数分布,如均匀分布`std::uniform_int_distribution`或正态分布`std::normal_distribution`。 - 使用随机数引擎和随机数分布来生成随机数。 问题2:如何生成一个范围在[min, max]之间的随机整数? 答案:可以使用`std::uniform_int_distribution`来实现。以下是一个示例代码: ```cpp #include <iostream> #include <random> int main() { int min = 1; int max = 10; std::random_device rd; std::default_random_engine engine(rd()); std::uniform_int_distribution<int> distribution(min, max); int randomNum = distribution(engine); std::cout << "Random number: " << randomNum << std::endl; return 0; } ``` 问题3:如何生成一个范围在[0, 1)之间的随机浮点数? 答案:可以使用`std::uniform_real_distribution`来实现。以下是一个示例代码: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; std::default_random_engine engine(rd()); std::uniform_real_distribution<double> distribution(0.0, 1.0); double randomNum = distribution(engine); std::cout << "Random number: " << randomNum << std::endl; return 0; } ``` 这些是一些常见的C++随机数面试题,希望对你有所帮助!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值