免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3047 | 回复: 8
打印 上一主题 下一主题

随机的插入1-100之间的数字到a[100],不能重复 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-18 22:49 |只看该作者 |倒序浏览
  1. #include <iostream>

  2. #include <time.h>

  3. #define MAX 100

  4. using namespace std;



  5. int main(void) {

  6. srand((unsigned) time(NULL));

  7. int a[MAX];

  8. cout << "随机的100个不重复数字:" << endl;

  9. for (int i = 0; i < MAX; i++) {

  10. int temp = rand() % MAX + 1;

  11. for (int j = 0; j < i; j++) {

  12. if (a[j] == temp) {

  13. temp = rand() % MAX + 1;

  14. j = 0;

  15. }

  16. }

  17. a[i] = temp;

  18. cout << a[i] << endl;

  19. }

  20. //按順序排列,检查是不是全部包含了

  21. for (int i = 0; i < MAX; i++) {

  22. for (int j = i + 1; j < MAX; j++) {

  23. if (a[i] > a[j]) {

  24. int tmp = 0;

  25. tmp = a[i];

  26. a[i] = a[j];

  27. a[j] = tmp;

  28. }

  29. }

  30. }

  31. cout << "排好序的100個數:" << endl;

  32. for (int i = 0; i < MAX; i++)

  33. cout << a[i] << endl;

  34. return 0;

  35. }
复制代码
以上是我写的,感觉效率太低,请高手指教

论坛徽章:
0
2 [报告]
发表于 2010-05-18 23:04 |只看该作者
就是检查重复的效率低了一些,可以用空间换时间。再开一个数组,索引就是随机数,值1表示已经用过了,0表示没用过。产生随机数之后,立即查找这个数组。如果是一个重复的数,重新随机。
或者自己设计随机算法。比如100个数,第一次随机挑其中一个,用掉以后删去(这里也涉及到用数组还是链表的问题),再在剩下的数里面挑。

论坛徽章:
0
3 [报告]
发表于 2010-05-18 23:33 |只看该作者
使用vector
将1~100依序加入vector1;
目标是vector2;

int index;
int value;
for(int i=0;i<100;i++)
{
  index = rand()%(100 - i);
  value = vector1.at(index);
  vector1.remove(index);
  vector2.pushback(value);
}

大概这个意思吧,若不能用vector,可以使用list之类

论坛徽章:
0
4 [报告]
发表于 2010-05-19 00:07 |只看该作者
不就是shuffle么.
生成存储着1-100的数组 然后打乱就好了

论坛徽章:
0
5 [报告]
发表于 2010-05-19 00:25 |只看该作者
回复 4# DQP


    如何打乱...

论坛徽章:
0
6 [报告]
发表于 2010-05-19 04:56 |只看该作者
回复  DQP


    如何打乱...
biojingshui 发表于 2010-05-19 00:25



    随机交换两两位置,嗯,就160遍交换好了,就好象洗扑克牌。

论坛徽章:
0
7 [报告]
发表于 2010-05-19 09:03 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define MAX 100
  5. int i, j, temp, a[MAX];
  6. int main()
  7. {
  8.         srand((unsigned)time(NULL));
  9.         for (i = 0; i < MAX; ++i)
  10.                 a[i] = i + 1;
  11.         for (i = 0; i < MAX; ++i) {
  12.                 j = i + rand() % (MAX - i);
  13.                 temp = a[i];
  14.                 a[i] = a[j];
  15.                 a[j] = temp;
  16.         }
  17.         for (i = 0; i < MAX; ++i)
  18.                 printf("%4d", a[i]);
  19.         printf("\n");
  20.         return 0;
  21. }
复制代码
方法来自编程珠玑,如果我没记错

论坛徽章:
0
8 [报告]
发表于 2010-05-19 09:27 |只看该作者
编程珠玑.有机会一定要拜读

论坛徽章:
0
9 [报告]
发表于 2010-05-19 09:28 |只看该作者
  1. j = i + rand() % (MAX - i);
复制代码
嗯,每个都换了下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP