现在脑袋发热,一时想不出来

鹏割 2014-05-28 09:36:21
RT,以下是代码
template <typename ElemType>
void MySeqTree<ElemType>::RandCreat()
{
srand((unsigned)time(NULL));
finalIndex=rand()%9+1;
const int n=26; //
char SS[n]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
if(finalIndex!=-1)
{
initialAddress=new ElemType[finalIndex+1];
assert(initialAddress!=0);
for(int i=0;i<=finalIndex+1;++i)
{
int j;
j=rand()%26;
initialAddress[i]=SS[j];
}
}


}

注意for循环里的,我想让随机生成的SS[j]不会重复,该怎么改代码
...全文
310 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_admi 2014-05-31
  • 打赏
  • 举报
回复
没必要这么麻烦吧? 我建议只要往C++容器set中填充数据就行了,直到数据个数达到楼主需要。
引用 9 楼 zhao4zhong1 的回复:
随机必然有重复。 所谓“不重复的随机”其实是洗牌。 洗牌算法参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}
  • 打赏
  • 举报
回复
引用 15 楼 u013163178 的回复:
把数组里面的东西保存在链表里面,每次随机,如果随机到n,那就是第n个节点的数据,然后将该节点删除,让后随机范围减一,再一次随机,依次下去,这样你就不会遇到重复的了。
感觉15楼说的比较接近,在数组的子集中随机比较好
xjm2006 2014-05-31
  • 打赏
  • 举报
回复

		int j = 0;		
		for(int i=0;i<=finalIndex+1;++i)
		{
			j = (j + (1 + rand()%25))%26;
			initialAddress[i]=SS[j];
		}
这样改如何?类似哈希表的散列法
「已注销」 2014-05-31
  • 打赏
  • 举报
回复
把数组里面的东西保存在链表里面,每次随机,如果随机到n,那就是第n个节点的数据,然后将该节点删除,让后随机范围减一,再一次随机,依次下去,这样你就不会遇到重复的了。
mujiok2003 2014-05-30
  • 打赏
  • 举报
回复
引用 12 楼 magicpapacy 的回复:
std::random_shuffle(SS, SS+26);
++
yanasdf789 2014-05-30
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
随机必然有重复。 所谓“不重复的随机”其实是洗牌。 洗牌算法参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}
牛B 啊
magicpapacy 2014-05-30
  • 打赏
  • 举报
回复
std::random_shuffle(SS, SS+26);
cao_julians 2014-05-30
  • 打赏
  • 举报
回复
人称圣经的K&R C,全名是《C programming language》--汉译名《C程序设计语言》----明确地说明了书是讲语言的,是用来程序设计的语言,至于程序设计则不是本书关注的。 我们的教材《C语言程序设计》----是不是应该讲程序设计?
cao_julians 2014-05-30
  • 打赏
  • 举报
回复
程序设计能力,有很大一部分是“陈述”能力,生活中有太多太多的东西可以代码形式陈述出来。 可是现在的教程,名为“**语言程序设计”,其实只讲了语言的一小部分,用一些“程序”去验证语言的某些特性。程序设计相关的技术、方法、思想基本没有。 充其量,是**程序设计的语言-------并不是**语言的程序设计
赵4老师 2014-05-29
  • 打赏
  • 举报
回复
随机必然有重复。 所谓“不重复的随机”其实是洗牌。 洗牌算法参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}
buyong 2014-05-29
  • 打赏
  • 举报
回复

vector<int> v;
for(int i=0;i<=finalIndex+1;++i)
        {
            int j;
            j=rand()%26;
            while(find(v.begin(); v.end(); j) != v.end())    j=rand()%26;
            v.push_back(j);
            initialAddress[i]=SS[j];
        }
23妍 2014-05-29
  • 打赏
  • 举报
回复
直接srand(const数);
cao_julians 2014-05-29
  • 打赏
  • 举报
回复
一副扑克牌,”洗“几遍后是不是还是那些牌?但位置不同了? 1. 模拟”洗牌“,用随机方法:把指定位置的那个与由随机函数产生位置的那个互换,一轮即可(26次) 2.其后,用顺序方法一个个找,找出的一定不重复
xiaohuh421 2014-05-29
  • 打赏
  • 举报
回复
int maxRan = 26; for(int i=0;i<=finalIndex+1;++i) { int j; j=rand()%maxRan; initialAddress[i]=SS[j]; SS[j] = SS[maxRan-1]; --maxRan; } 思想是这样的, 随机一个后, 就把随机到的那一个放到最后, 然后再随机前面的数据, 这样就可以保证不重复. 第一次是在0-25间取值, 第二次是在0-24间取值. 因为没有随机到的数据都在前面, 所以可以保证随机不会重复.
微笑向暖0 2014-05-28
  • 打赏
  • 举报
回复
if(finalIndex!=-1)
{
initialAddress=new ElemType[finalIndex+1];
assert(initialAddress!=0);
int flag[26];//标记 参考哈希函数,直接地址法
for(int i=0;i<26;++i)
flag[i] = -1;
int num =0;
for(int i=0;i<=finalIndex+1;++i)
{
int j;
j=rand()%26;
while(flag[j]!=-1)
{
j= (j+1)%26;
}
flag[j] = j;
initialAddress[i]=SS[j];
}
}
鹏割 2014-05-28
  • 打赏
  • 举报
回复
引用 2 楼 yangyuyu77584 的回复:
srand((unsigned)time( NULL));在for循环前加入。
没用啊,还是会重复
笑梦码侬生 2014-05-28
  • 打赏
  • 举报
回复
srand((unsigned)time( NULL));在for循环前加入。
merlinfang 2014-05-28
  • 打赏
  • 举报
回复
你要再加个flag[26], 然后检测如果用过了,就再随机

65,209

社区成员

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

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