码迷,mamicode.com
首页 > 编程语言 > 详细

算法练习:产生指定范围的随机数

时间:2015-06-15 09:24:46      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

一、问题描述

给出一个整型数组,以及一个区间范围[minmax],写一个函数产生一个在此区间范围内的随机数,并且该随机数不在数组里,假设总能找到该随机数。

 

二、分析与解答

分成两步,即可解答。第一步,生成一个随机数x包含于[minmax];第二步,判断此随机数是否在数组中,是的话重新生成一个随机数再执行第二步,否则返回此随机数。

在判断随机数是否在数组中,如果采用顺序查找的方式,则查找的时间复杂度为O(n)。在最坏的情况下,假设在产生的前n个随机数都在数组中,直到第n+1个才符合条件,那么,整个算法的时间复杂度为O(n^2)

那么,能否进一步提升效率呢,经分析,能提升的部分可以在判重的部分,先对数组进行排序,然后利用二分查找法,使查找的时间复杂度从O(n)--->O(logn)。所以整个算法的时间复杂度为O(nlogn)

 

三、代码与实现

#include <iostream>
#include <algorithm>
#include <ctime>
#include <cstdlib>

using namespace std;


int RandNumInRange( int nArray[], int nCount, int nMin, int nMax )
{
	if ( nMin > nMax )
	{
		int temp = nMax;
		nMax = nMin;
		nMin = temp;
	}

	if ( nMin == nMax )
	{
		return nMin;
	}

	
	int nRet = nMin + rand() % (nMax - nMin);
	if ( nArray == NULL || nCount <= 0 )
	{
		return nRet;
	}


	//从小到大排序
	sort( nArray, nArray+nCount );


	while ( true )
	{
		int low = 0;
		int high = nCount - 1;
		int mid = 0;
		bool bContinue = false;
		while( low <= high )
		{
			mid = (low + high)/2;
			if ( nArray[mid] == nRet )
			{
				bContinue = true;
				break;
			}
			else if ( nArray[mid] > nRet )
			{
				high = high - 1;
			}
			else
			{
				low = low + 1;
			}
		}

		if ( !bContinue )
		{
			break;
		}

		//再次生成一个随机数
		nRet = nMin + rand() % (nMax - nMin);

	}

		
	return nRet;
}

int main()
{
	//随机种子 
	srand( (unsigned)time( NULL ) );

	int nArray[] = { 10, 12, 18, 14, 15, 13 };
	for ( int i = 0; i < 20; ++i )
	{
		cout << RandNumInRange( nArray, _countof(nArray), 5, 5 ) << endl;
	}

	return 0;
}



系列文章说明:
1.本系列文章[算法练习],仅仅是本人学习过程的一个记录以及自我激励,没有什么说教的意思。如果能给读者带来些许知识及感悟,那是我的荣幸。
2.本系列文章是本人学习陈东锋老师《进军硅谷,程序员面试揭秘》一书而写的一些心得体会,文章大多数观点均来自此书,特此说明!
3.文章之中,难免有诸多的错误与不足,欢迎读者批评指正,谢谢.


作者:山丘儿
转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46494611



算法练习:产生指定范围的随机数

标签:

原文地址:http://blog.csdn.net/s634772208/article/details/46494611

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!