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

一、问题描述

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

二、分析与解答

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

在判断随机数是否在数组中,如果采用顺序查找的方式,则查找的时间复杂度为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

时间: 2024-10-10 00:26:17

算法练习:产生指定范围的随机数的相关文章

2016/1/14 java生成指定范围的随机数

java生成指定范围的随机数 1 package edu.sjtu.erplab.io; 2 3 import java.util.Random; 4 5 public class RandomTest { 6 public static void main(String[] args) { 7 int max=20; 8 int min=10; 9 Random random = new Random(); 10 11 int s = random.nextInt(max)%(max-min+

Java记录 -39- 生成指定范围内随机数

工作当中许多地方会遇到,需要获取某指定范围内的随机数.直接利用Java给的的API中的函数不能满足,需要做些改变. 实例:产生10个指定范围内的随机数. public class RandomTest {     public static void main(String[] args) {         int max = 10;         int min = 2;         //生成10个指定范围的随机数         Random random = new Random(

指定范围的随机数

/** * 指定范围的随机数 */ public static int getRandom(int min, int max) { Random random = new Random(); return random.nextInt(max) % (max - min + 1) + min; } 原文地址:https://www.cnblogs.com/H-BolinBlog/p/9738063.html

算法生成指定数目的随机数

package text; import java.util.Scanner; public class random { public static void main(String[] args) { int a=13, b=35,m=87,Xo=19; int z=Xo; System.out.print("请输入生成随机数的个数:"); Scanner cin1=new Scanner(System.in); int j=cin1.nextInt(); int q=0; for

4月6日--求指定范围的随机数

转换随机数为指定范围的整数 1.Math.floor(Math.random()*(MAX-MIN+1))+MIN <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Math的常用方法3</title> <script type="text/javascript"> var

sql 指定范围 获取随机数

DECLARE @nMinimumCount INT= 1DECLARE @nMaximumCount INT= 100SELECT abs(CHECKSUM(NEWID()))%(@nMaximumCount+ [email protected])[email protected] @nMinimumCount ,@nMaximumCount为指定获取随机数的最小和最大范围

一天一道算法题—2015-10-22(等概率的随机数)

参考文章:http://blog.csdn.net/a83610312/article/details/11864265http://www.cnblogs.com/dwdxdy/archive/2012/07/28/2613135.html 刚刚笔试完滴滴的题目,有一道题叫做,用一枚硬币随机生成1~3的随机数??如果硬币不准,该怎么办? 想起一道类似的,叫做: 如果函数random(5)可以等概率的生成1~5之间的随机数,请用random(5)生成random(7). !!!原来是智力题,看来

使用Random类生成指定范围的随机数

目的:要生成在[min,max]之间的随机整数 public class RandomTest { public static void main(String[] args) { int max=20; int min=10; Random random = new Random(); /* random.nextInt(max)表示生成[0,max]之间的随机数,然后对(max-min+1)取模. 以生成[10,20]随机数为例,首先生成0-20的随机数,然后对(20-10+1)取模得到[0

「C语言」「算法」输出指定范围内的素数

#include <stdio.h> //输出指定范围内的素数 int main(){ int a,b; int i,j; printf("请输入整数范围并用空格隔开:\n"); scanf("%d%d",&a,&b); for(i=a;i<=b;i++){ for(j=2;j<=i-1;j++) { if(i%j==0) break; } if(j>=i-1) printf("%d ",i); }