随机数为数组的下标,可有下标相同情况怎么解决??

/*有一个数组{1,2,3,4,5,6,7,8,9,10};请写出一个程序把这个数组顺序打乱
提示: rand()函数 返回一个 0到10000的随机数
问题: 随机数为数组的下标,可有下标相同情况怎么解决??

//rand()
#include <iostream.h>
#include<stdlib.h>
int main()
{
int array[10]={1,2,3,4,5,6,7,8,9,10};

for(int i=1 ; i<=10; i++)
{int a=rand()%10;
cout<<array[a]<<" ";
}
return 0;
}

解决方法:分两步。
第一:
定义一个数组。sub[n],用来存放已经选出的随机数下标。

第二:
在如每个随机数产生后,在sub[n]中判断一下,是否已经有相同的了。
如果有相同的,则再产生一次。直到没有相同的。
如果没有相同的,就可以使用了。记得将使用过的数放在数组sub[n]中。
int a=rand()%10;
<<<<<<<<<<<==================在这里加一个判断。
cout<<array[a]<<" ";
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-01-09
应该说下面这个方法比你自己的方法要好点:)
基本思想:假设数组为a[10]
1.产生两个10(根据你的原始数组而定)以内的随机数rand1,rand2.
2.判断rand1是否等于rand2.如果等于回到第1步,否则到第三步.
3.交换a[rand1]和a[rand2].
4.重复上述步骤若干次即可实现你的要求(次数由你自己决定).

具体实现就不写出来了,都是些很简单的代码.
产生10以内的随机数
srand((unsigned int)time(NULL));
int rand1 = rand() % 10;
int rand2 = rand() % 10;本回答被提问者采纳
第2个回答  2008-01-09
将数组放入一个环形链表,随便从一个位置数起,数随机次,取出选中的并把它从链表中删除,直至为空
第3个回答  2008-01-09
解决重复问题并指出你另外的算法问题

因为rand()函数 返回一个 0到10000的随机数,所以rand()%10返回0的概率大过其他的。

我的代码如下:

bool mark[10];
for(int i = 0; i < 10; i++) mark[i] = true;

int n = 10;
int r = 0;
while(n > 0)
{
r = rand();
if (r != 0)
{
int a=rand()%10;
if (mark[a])
{
cout<<array[a]<<" ";
mark[a] = false;
n--;
}
}
}
第4个回答  2008-01-09
我想有两个解决方向
1.实现产生不同的随机数(网上搜一下)
2.允许产生相同的随机数,判断新产生的随机数,如果发生重复,则重新产生,直到新产生的随机数是前边没出现过的
另外,产生随机数用rand()还不行,还要加上srand((unsigned)time(NULL));(需要头文件time.h)

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网