如何生成一个随机序列,不能重复
如何生成一个 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




