如何实现对字符串随机打乱顺序?

ccnyou 2010-02-26 05:21:52
如有串“abcde”,每次运行都以不同的顺序输出,例如bdeac,要求不能存在原串的长度大于一的子串,就是ab***是不满足的,怎么做?
...全文
1116 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccnyou 2010-02-26
  • 打赏
  • 举报
回复
非常感谢大家!特别是5#的code and 7#的idea。对于5#,我理解了,不过有一句if(dest[i]==dest[j])
{}//判断是否重复
我觉得似乎不可,如果原串是"aaabbb",则你的运行结果应该只有a,b了。7楼的主意不错,我试下,再次感谢大家!
macrojj 2010-02-26
  • 打赏
  • 举报
回复
引用 5 楼 dubiousway 的回复:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
int randm(int max){return rand()%(max+1);
}获得随机数 这个很简单
int randNext(int pre){int rt;while((rt=randm(4))==pre|| rt==pre+1);return rt;
}获得除pre 和pre+1的随机数
void main(){char*s="abcde";char dest[6];char q;
dest[5]=0;for(int k=0;k<50;k++){// 这个循环仅是测试用,50次abcde随机序列 dest[0]=s[q=randm(4)];获取第一个随机数
for(int i=1;i<=4;i++)
{
dest[i]= s[q=randNext(q)];根据之前的 结果 产生不重复 不临近的随机数
for(int j=0;j<i;j++)if(dest[i]== dest[j])是否重复 如果重复了就不要这组
{
i--;break;
}
}
printf("%s\n",dest);
}
}
icansaymyabc 2010-02-26
  • 打赏
  • 举报
回复
打乱字符串很容易:一次产生两个随机数,把这两个位置的字符交换一下就行,多这么干几次字符串就乱了。
关键是你的限制条件太苛刻了,很难办。

不如写一个函数,用来测试处理后的字符串是否符合要求。每次打乱后测试一下,不符合要求又打乱一次,直到符合要求为止。

ccnyou 2010-02-26
  • 打赏
  • 举报
回复
要是楼上的代码多点注释多好啊!
dubiousway 2010-02-26
  • 打赏
  • 举报
回复


#include <stdio.h>
#include <stdlib.h>

int randm(int max){
return rand()%(max+1);
}
int randNext(int pre){
int rt;
while((rt=randm(4))==pre || rt==pre+1);
return rt;
}

void main(){
char *s="abcde";
char dest[6];
char q;
dest[5]=0;

for(int k=0;k<50;k++){ // 这个循环仅是测试用,50次abcde随机序列
dest[0]=s[q=randm(4)];
for(int i=1;i<=4;i++) {
dest[i]= s[q=randNext(q)];
for(int j=0;j<i;j++)
if(dest[i]== dest[j]){
i--;
break;
}
}
printf("%s\n",dest);
}
}


chaoliu1024 2010-02-26
  • 打赏
  • 举报
回复
rand()或srand()随机数函数
ccnyou 2010-02-26
  • 打赏
  • 举报
回复
二楼:你的思想我理解,只是第一步怎么做,能否细说?不能有重复哦(就是原来只有一个'a',不能跑出两个)
dubiousway 2010-02-26
  • 打赏
  • 举报
回复
1,先随机生成第一个字符
2,随机生成第2个字符,如果第2个字符在原串中排在第1个字符的后面,则重新生成
3,一次类推

ok?
FoxMessire 2010-02-26
  • 打赏
  • 举报
回复
要求不能存在原串的长度大于一的子串

啥意思?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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