CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

如何生成一个随机序列,不能重复

楼主holilyboy(*会飞的猪*)2004-08-03 20:24:24 在 C/C++ / C++ 语言 提问

如何生成一个   1----100   的随机排列的数列呢?  
  不能重复!  
   
  比如:   58,32,20,0,25,4,6,……  
   
  谢谢!  
  问题点数:20、回复次数:12Top

1 楼holilyboy(*会飞的猪*)回复于 2004-08-03 20:38:05 得分 0

 
  为什么buff[]   里的值会相同呢??  
   
  #include   <iostream>  
  #include   <ctime>  
   
  using   namespace   std;  
   
  void   ff(void);  
   
  void   main(void)  
  {  
  ff();  
  }  
   
  void   ff(void)  
  {  
  int   temp;  
  int   buff[100];  
   
  srand((unsigned)time(NULL));  
  memset(buff,   -1,   sizeof   (buff));  
   
   
  for   (int   kk   =   0;   kk   <   100;   kk++)  
  {  
  srand((unsigned)time(NULL));  
  temp   =   rand()%   100;  
   
  buff[kk]   =   temp;  
  }  
   
  for   (int   ii   =   0;   ii   <   100;   ii++)  
  {  
  cout   <<   buff[ii]   <<   endl;  
  }  
  }  
  Top

2 楼antijpn(antijpn)回复于 2004-08-03 20:45:38 得分 5

光是rand的话很可能就有重复,因为不能保证每次rand的结果不同  
   
  而且srand的种子是time,这个东西的单位是second,而循环太快了,很多次的种子都一样,所以就会产生相同的随机数  
   
  可以给你一个思路,每次生成的随机数对还需要生成的随机数数量取余,然后根据这个来排定位置,等会儿我会给出一个代码Top

3 楼rorot(rorot)回复于 2004-08-03 20:47:32 得分 5

#include   <iostream>  
  #include   <algorithm>  
  #include   <iterator>  
  #include   <vector>  
   
  int   main()  
  {  
  std::vector<int>   ivec(0,   100);  
  for   (   int   i=0;   i<100;   ++i   )  
  ivec.push_back(i);  
   
  std::copy(   ivec.begin(),   ivec.end(),         std::ostream_iterator<int>(std::cout,   "   ")   );  
  std::cout   <<   "\n\n";  
  std::vector<int>::iterator   it   =   ivec.begin();  
  std::vector<int>::iterator   it_end   =   ivec.end();  
  std::random_shuffle(   ivec.begin(),   ivec.end()   );  
   
  std::copy(   it,   it_end,   std::ostream_iterator<int>(std::cout,   "   ")   );  
  return   0;  
  }Top

4 楼xteaj(半桶水)回复于 2004-08-03 21:05:30 得分 0

不能重复应不是随机数了,是随机数就有可能重复。Top

5 楼antijpn(antijpn)回复于 2004-08-04 13:38:02 得分 0

楼主要的是随机序列,不是随机数(虽然随机序列需要由随机数生成)  
  下面的代码是生成随机序列的,稍微修改一下就可以适应更大范围的序列  
   
  #include   <time.h>  
  #include   <iostream>  
  void   func();  
  void   main()  
  {  
  func();  
  }  
  void   func()  
  {  
  int   ia[100],obj[100];  
  srand((unsigned   int)time(NULL));  
   
  for(int   i=100;i>0;i--)  
  {  
  obj[100-i]=rand()%i;  
  ia[100-i]=100-i;  
  }  
   
  for(int   i=0;i<100;i++)  
  {  
  for(int   j=0;j<=obj[i];j++)  
  {  
  obj[i]+=   ia[j]==-1?1:0;  
  ia[j]=   j==obj[i]?-1:ia[j];  
  }  
  std::cout<<(obj[i])<<((i+1)%10?'   ':'\n');  
  }  
  }  
  Top

6 楼hmaple(hmaple)回复于 2004-08-04 14:55:43 得分 5

srand()是设置随机数列的种子,种子相同,随机数列也相同。  
  每次循环都重新设置种子,就会重新产生一个随机数列。  
  由于循环很快,所以两次循环取得时间有可能是相同的,种子相同,随机数列就相同,所以你的buffer里有很多相同的数。  
  应该改成这样:  
  srand((unsigned)time(NULL));  
  for   (int   kk   =   0;   kk   <   100;   kk++)  
  {  
  temp   =   rand()%   100;  
  buff[kk]   =   temp;  
  }  
   
  但这样不能保证这一百里面没有重复数字。如果不想要重复数字,需要判断新产生的随机数是否已经有了。Top

7 楼RookieStar(Yukon)回复于 2004-08-04 15:37:23 得分 5

不能重复应不是随机数了,是随机数就有可能重复。  
  /////////////////////////////////////////////  
  同意这句话。  
   
  不过要实现也不难:  
  #include<iostream>  
  #include<cstdlib>  
  #include<ctime>  
  #include<iomanip>  
  using   namespace   std;  
   
  int   main()  
  {  
  int   i,data[100],random;  
  srand(unsigned(time(NULL)));  
  for   (i=0;i<100;++i)   data[i]=i+1;  
   
  for   (i=0;i<100;++i)  
  {  
  random=i+rand()%(100-i);  
  swap(data[i],data[random]);  
  }  
   
  for   (i=0;i<100;++i)  
  {  
  cout<<setw(4)<<data[i];  
  if   (i%10==9)   cout<<endl;  
  }  
   
  return   0;  
  }Top

8 楼wmajia(主席打倒地主分土地建新政权,谁来打倒官商勾结分房子推翻社会主义)回复于 2004-08-04 15:43:58 得分 0

RookieStar(★)(巴巴罗萨)(DOOM3是我的噩梦)    
   
  给出了类似洗牌的算法。是OK的Top

9 楼dodont(浪无风)bbs.mp4tech.net()回复于 2004-08-04 15:49:56 得分 0

楼主的意思是这个意思:  
  有一个集合{x,y,z...}执行下面的操作:  
  1.每次随机取一个数  
  2.在集合中把这个数去掉  
  3.重复1,2步,直至集合为空  
   
  如果是这个意思的话,那代码应该很好写的吧。用一个链表吧。Top

10 楼dodont(浪无风)bbs.mp4tech.net()回复于 2004-08-04 15:51:03 得分 0

不好意思,刚刚写错了,应该是:  
   
  楼主的意思是不是这个意思:  
  ............Top

11 楼hmaple(hmaple)回复于 2004-08-04 17:11:36 得分 0

用vector解决这个问题。不需要很多次比较,效率能高点。  
   
  using   namespace   std;  
  #include   <iostream>  
  #include   <algorithm>  
  #include   <iterator>  
  #include   <vector>  
  #include   <time.h>  
   
  int   main()  
  {  
  int   buff[100];  
  int   temp;  
   
  vector<int>   myVec;  
  vector<int>::iterator   ite;  
   
  for   (   int   i=0;   i<100;   ++i   )  
  myVec.push_back(i);  
   
  srand((unsigned   int)time(NULL));  
   
  for   (int   kk   =   0;   kk   <   100;   kk++)  
  {  
  temp   =   rand()%   (100-kk);  
  buff[kk]   =   myVec[temp];  
  myVec.erase(myVec.begin()   +   temp);  
  }  
  for   (int   ii   =   0;   ii   <   100;   ii++)  
  {  
  cout   <<   buff[ii]   <<   endl;  
  }  
  return   0;  
  }  
   
  Top

12 楼neverendstory(明天)回复于 2004-08-04 17:27:32 得分 0

定义一个数组,第一次产生一个随机数就写进去。  
  下次再产生随机数的时候,先比较有没有该随机数,有就重新随机,没有就写进去。  
  Top

相关问题

  • 求随机序列生成算法!
  • 用VB如何生成随机数的序列?
  • 如何生成不重复的序列号,高分求助!
  • 如何生成不重复的随机数
  • 如何生成决不重复的随机数?(c#语言)
  • 请问怎么让生成的随机数不重复呢?
  • 如何生成不重复的随机数?有点难度
  • 如何批量生成16位的随机不重复数字
  • 怎样用vbs生成无重复的随机函数?
  • 如何生成不重复随机字符串

关键词

  • vector
  • null
  • 随机序列
  • ivec
  • 随机数
  • 生成
  • std
  • buff
  • srand
  • 不能重复

得分解答快速导航

  • 帖主:holilyboy
  • antijpn
  • rorot
  • hmaple
  • RookieStar

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo