编程珠玑之1.4生成小于n且没有重复的k个整数

生成小于n且没有重复的k个整数可以使用如下方法:

方法一:使用C++的set,由于set具有排序功能,而且里面的数不会重复,所以可以生成随机数字插入到set中,直到set中的数字个数为k,具体代码如下:

//solution 1:use set

#include<iostream>
#include<set>
#include<ctime>
#include<cstdlib>

using namespace std;

#define N 10000000

int main()
{
	set<int> S;
	set<int>::iterator j;
	int i;
	int k;

	cout<<"please input k:"<<endl;
	cin>>k;

	srand((unsigned)time(NULL));

	//gererate k numbers by random and put them into S
	while(S.size() < k)
	{
		i = rand()%N;
		S.insert(i);
	}

	for(j=S.begin();j!=S.end();j++)
		cout<<*j<<"    ";
	return 0;
}

方法二:使用一个数组,按顺序存放n个数,然后把数组中到数字打乱,取前k个数字。代码如下

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

using namespace std;

#define N 10000000
void swap(int a,int b);
int main()
{
	int i;
	int k;
	int *num = new int[N];

	cout<<"please input k:";
	cin>>k;
	//initialized num array
	for(i = 0;i < N;i++)
		num[i] = i;

	//swap numbers of array
	srand((unsigned)time(NULL));
	for(i = 0;i < k;i ++)
		swap(num[i],num[rand()%N]);

	//output numbers
	for(i = 0;i < k;i ++)
		cout<<num[i]<<"    ";

	delete[] num;
	cout<<endl;
}

void swap(int a,int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}

       

时间: 2024-09-17 03:59:18

编程珠玑之1.4生成小于n且没有重复的k个整数的相关文章

编程珠玑之生成0至n-1之间的k个不同随机序列的扩展问题 --2014人人网笔试题目

  <编程珠玑>中习题1.4的题目是:"如果认真考虑了习题3,你将会面对生成小于n且没有重复的k个整数的问题.最简单的方法就是使用前k个正整数.这个极端的数据集合将不会明显的改变位图方法的运行时间,但是可能会歪曲系统排序的运行时间.如何生成位于0至n - 1之间的k个不同的随机顺序的随机整数?尽量使你的程序简短高效."  解决这个问题可以使用以空间换时间的方式,基本的思想是 利用洗牌的原理,将n个数(0至n-1)按次序排好,依次让每个数和一个随机挑选出的位子进行互换,这样肯

《编程珠玑(续)(修订版)》—第1章1.1节计算素数

第1章 性能监视工具 编程珠玑(续)(修订版) 听诊器是一种简单工具,却给医生的工作带来了革命:它让内科医生能有效地监控病人的身体.性能监视工具(profiler)对程序起着同样的作用. 你现在用什么工具来研究程序?复杂的分析系统很多,既有交互式调试器,又有程序动画系统.正如CT扫描仪永远代替不了听诊器一样,复杂的软件也永远代替不了程序员用来监控程序的最简单工具--性能监视工具,我们用它了解程序各部分的执行频率. 本章先用两种性能监视工具来加速一个小程序(记住真正的目的是说明性能监视工具).后续

编程珠玑--旋转算法

旋转算法出自<编程珠玑>第二章题目.   <编程珠玑>一书对算法是极度推崇,这点意识在我们看书的时候每每都有被灌输.使用一种好的算法往往能使得程序更加漂亮,也很能带给我们程序员某种满足感.   题目:将一个n元一维数组a[n]左移i个位置.例如,当n=8,i=3时,数组abcdefgh旋转为defghabc.请设计一个算法完成这个任务.   1. 块交换法: 分析:将n元一维数组a[n]分解为两块,将第一块存储在临时数组中,将第二块前移i个单位,再将临时数组加入到第二块后面.  

编程珠玑--位图法排序

题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复.求如何将这n个正整数升序排列. 约束:最多有1MB的内存空间可用,有充足的磁盘存储空间.   分析:这个题目的最大亮点是只有1MB的内存空间,我们可以通过计算得出,内存只有1MB可以储存的int(4byte)有10^3*10^3/4=250 000个号码.而包含正整数的文件约为10^7个int大小.这意味着无法将所有文件中的正整数一次读取进入到内存空间中去进行排序算法.因此衍生出下面两种方法:   方法1

《编程珠玑(第2版•修订版)》—第1章1.1节一次友好的对话

第一部分 基础 编程珠玑(第2版•修订版) 这一部分的5章回顾程序设计的基础知识.第1章介绍一个问题的历史,我们把仔细的问题定义和直接的程序设计技术结合起来,得到优美的解决方案.这一章揭示了本书的中心思想:对实例研究的深入思考不仅很有趣,而且可以获得实际的益处. 第2章讨论3个问题,其中重点强调了如何由算法的融会贯通获得简单而高效的代码.第3章总结数据结构在软件设计中所起到的关键作用. 第4章介绍一个编写正确代码的工具--程序验证.在第9章.第11章和第14章中生成复杂(且快速)的函数时,大量使

《编程珠玑(续)(修订版)》—第2章2.1节Awk中的关联数组

第2章 关联数组编程珠玑(续)(修订版)人类学家说,语言深刻地影响了世界观.一般把这个观察结果称为"Whorf假说"① ,也经常把它总结为"语言塑造了人的思想". 跟大多数程序员一样,我使用的Algol系列的语言塑造了我的计算思维.对于像我这样的程序员来说,PL/1.C和Pascal看起来都很相似,我们不难把这样的代码翻译成COBOL或Fortran的代码.用这些语言能轻易地表达我们旧的.习以为常的思维模式. 另外一些语言则挑战了我们对于计算的看法.我们感到惊奇的是

编程珠玑--粗略估算

粗略估算是<编程珠玑>中第七章提到的内容.   这篇文章将"粗略估算"看做是一项工程技术,是程序员必备的一项技能之一. 本人非常同意这个观点.粗略估算是一种把复杂的事情简单化的能力.我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力.如果你能较为准确的估算出一个程序的输出结果,如果你能准确估算出这个程序的运行时间,如果你能准确估算出这个项目的开发时间--如果你能拥有这样的能力,该有多么美好啊.所以难怪乎像微软.Google这样的大公司老喜欢出"请计

新手菜鸟关于编程珠玑的疑问

问题描述 新手菜鸟关于编程珠玑的疑问 大神们好,我是新手,在看编程珠玑的时候想到一个问题.问题描述如下: 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数 如果内存不足,仅可以用文件来进行处理,如何处理? 编程珠玑和网上各种大神的想法都是这样的: 按最高位分为两段,没有出现的那个数,肯定在比较小的段里面. 各位是不考虑这种情况,还是不可能出现这种情况?: 按每一位分段,分出来的都是相等数目的数.比如说从42亿个32位数里面取出来2亿个数,全取对称数.比如第一

《编程珠玑(续)(修订版)》目录—导读

内容提要 编程珠玑(续)(修订版) 本书是计算机科学方面的经典名著<编程珠玑>的姊妹篇,讲述了对于程序员有共性的知识.本书延续了<编程珠玑>的特色,通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行透彻而睿智的描述,为复杂的编程问题提供清晰而完备的解决思路.书中涵盖了程序员操纵程序的技术.程序员取舍的技巧.输入和输出设计以及算法示例,这些内容结合成一个有机的整体,如一串串珠玑展示给程序员.本书对各个层次的程序员都具有很高的阅读价值. 版权声明 编程珠