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

holilyboy 2004-08-03 08:24:24
如何生成一个 1----100 的随机排列的数列呢?
不能重复!

比如: 58,32,20,0,25,4,6,……

谢谢!
...全文
767 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
neverendstory 2004-08-04
  • 打赏
  • 举报
回复
定义一个数组,第一次产生一个随机数就写进去。
下次再产生随机数的时候,先比较有没有该随机数,有就重新随机,没有就写进去。
hmaple 2004-08-04
  • 打赏
  • 举报
回复
用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;
}

dodont 2004-08-04
  • 打赏
  • 举报
回复
不好意思,刚刚写错了,应该是:

楼主的意思是不是这个意思:
............
dodont 2004-08-04
  • 打赏
  • 举报
回复
楼主的意思是这个意思:
有一个集合{x,y,z...}执行下面的操作:
1.每次随机取一个数
2.在集合中把这个数去掉
3.重复1,2步,直至集合为空

如果是这个意思的话,那代码应该很好写的吧。用一个链表吧。
wmajia 2004-08-04
  • 打赏
  • 举报
回复
RookieStar(★)(巴巴罗萨)(DOOM3是我的噩梦)

给出了类似洗牌的算法。是OK的
RookieStar 2004-08-04
  • 打赏
  • 举报
回复
不能重复应不是随机数了,是随机数就有可能重复。
/////////////////////////////////////////////
同意这句话。

不过要实现也不难:
#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;
}
hmaple 2004-08-04
  • 打赏
  • 举报
回复
srand()是设置随机数列的种子,种子相同,随机数列也相同。
每次循环都重新设置种子,就会重新产生一个随机数列。
由于循环很快,所以两次循环取得时间有可能是相同的,种子相同,随机数列就相同,所以你的buffer里有很多相同的数。
应该改成这样:
srand((unsigned)time(NULL));
for (int kk = 0; kk < 100; kk++)
{
temp = rand()% 100;
buff[kk] = temp;
}

但这样不能保证这一百里面没有重复数字。如果不想要重复数字,需要判断新产生的随机数是否已经有了。
antijpn 2004-08-04
  • 打赏
  • 举报
回复
楼主要的是随机序列,不是随机数(虽然随机序列需要由随机数生成)
下面的代码是生成随机序列的,稍微修改一下就可以适应更大范围的序列

#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');
}
}
  • 打赏
  • 举报
回复
不能重复应不是随机数了,是随机数就有可能重复。
rorot 2004-08-03
  • 打赏
  • 举报
回复
#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;
}
antijpn 2004-08-03
  • 打赏
  • 举报
回复
光是rand的话很可能就有重复,因为不能保证每次rand的结果不同

而且srand的种子是time,这个东西的单位是second,而循环太快了,很多次的种子都一样,所以就会产生相同的随机数

可以给你一个思路,每次生成的随机数对还需要生成的随机数数量取余,然后根据这个来排定位置,等会儿我会给出一个代码
holilyboy 2004-08-03
  • 打赏
  • 举报
回复

为什么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;
}
}

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧