就是s={1,2,3,4,5}
随机生成任意长度的数字串,可以有重复,但是一定要确保串中每个数字都有出现
请问怎么搞?谢谢

解决方案 »

  1.   

    这思路可以么?字符串值对应一个key值,比如flag,默认=ralse,随机取值,如果选中,置true,然后在剩下的key=false的里面再随即取值,取值过程同前面。
      

  2.   

    然后在剩下的key=false的里面再随即取值,取值过程同前面。-----------》这个如何实现?
      

  3.   

    这题比较简单啊,就以楼主的5个数字来说吧
    s={1,2,3,4,5}
    那么,同时声明一个和s长度一样的byte类型的数组b,初始值默认都为0。用以存放s中对应下标的数字字符是否出现过!!比如说,通过随机函数(控制范围则是s或b的下标范围),将会得到一个下标数,如果该下标所对应的数字为1,则重新随机取数;为0的话则直接将s中对应下标的数字字符打印出来,并将b对应下标的数置1.
    如此循环即可。PS:为了避免随机数尽可能重复,你可以在取随机数时加入一个时间种子以降低随机数的重复的可能性!
      

  4.   

    字符串可以有重复,把它当key是不可以的 
      

  5.   


        public  static  void  main(String[]  args)  {  
         StringBuffer sb=new StringBuffer();
         int max=(int)(Math.random()*10000);
         for(int i=1;i<max;i++){
             sb.append(i);
         }
         System.out.println(sb);
        } 这样?呵呵
      

  6.   


    package com.zznode.utils;public class TTest
    {
    public static boolean existZero(byte b[])
    {// 查看数组中是否有0存在
    int len = b.length;
    boolean flag = false;
    for (int i = 0; i < len; i++)
    {
    if (b[i] == 0)
    {
    flag = true;
    break;
    }
    }
    return flag;
    } public static void main(String[] args)
    {
    int digit[] = { 1, 3, 5, 4, 6, 9 };
    int rand = 0, len = digit.length;
    byte b[] = new byte[len]; while (existZero(b))
    {// 数组b中有0则继续执行,全为1时则退出
    rand = (int) Math.floor(Math.random() * len);
    System.out.print(digit[rand]);
    if (b[rand] == 0)
    b[rand] = 1;
    } // 楼主可自行测试注释部分的代码
    // System.out.println("查看标志数组:");
    // for(int i=0;i<len;i++)
    // System.out.print(b[i]);
    }
    }
    第一次输出结果如下:
    5464544156144333369
    第二次输出结果如下:
    453361319
    第三次输出结果如下:
    4116159441154916666693PS:因为有随机数存在,所以每次输出结果可能不一样,但能保证digit数组中所有数字都至少访问一次!
      

  7.   

    另外一个帖子已经回复过的楼主觉得这样不好吗:随机生成四个大于0的整数,组成字符串: 
    a...ab...bc...cd...d 
    然后随机排序
      

  8.   

    不太理解楼主的意思。
    可以有重复,有都出现。
    不清楚楼主要重复多少次,满足上面的条件。如果重复次数很多的话, java自带的Random就是可以啊(本身Random就是这个含义)
      

  9.   

    String s={1,2,3,4,5};
    char[] all=s.toCharArray();//转化成一个字符数组
    int[] ed=new int[all.length];//整形数组,记录已经输出的数组下标
    int i=0;//记录已经输出的字符个数
    loop:while(i<all.length){//查看是否已经输出完毕
         int a=(int)(Math.random()*all.length);//产生0---all.length-1之间的随机数
         for(int j=0;j<i;j++){
             if(ed[j]==a){//判断是否该下标已经出现过
              continue loop;
               }
            }
         ed[i++]=a;//没有将a的值加到ed数组中i++;
         System.out.print(all[a]);//输出
      }没工具,手写的 不知道是不是有错,自己查查吧
         
      

  10.   

    或者将楼主的需求直接写在一个函数,如下:
    package com.zznode.utils;public class TTest
    {
    public static String printAllDigitWithRepeat(int digit[])
    {
    int rand = 0, len = digit.length;
    byte b[] = new byte[len];
    StringBuffer sb=new StringBuffer("");

    while(true)
    {
    boolean flag = false;
    for (int i = 0; i < len; i++)
    {
    if (b[i] == 0)
    {
    flag = true;
    break;
    }
    }
    if(flag==false)
    break; //没有0了时退出外层循环
    else
    {//有0则继续在sb后添加
    rand = (int) Math.floor(Math.random() * len);
    //System.out.print(digit[rand]+" ");
    sb.append(digit[rand]+" ");
    if (b[rand] == 0)
    b[rand] = 1;
    }

    }

    return sb.toString();
    } public static void main(String[] args)
    {
    int digit[] = {0,1,2,3,4,5,6}; //可自己再添加数字
    System.out.println(printAllDigitWithRepeat(digit));
    }
    }
      

  11.   

    谢谢各位指点尤其是paullbm的代码
    zhyanl的代码思路也对。
      

  12.   

    其实很简单
    首先为了确保都出现,把s={1,2,3,4,5} 的五个都顺序放进去,然后再随机选择最后再打乱一下
    int[] src = {1,2,3,4,5};
    int[] dst = new int[src.length + new Random().nextInt(10)];
    System.arraycopy(src, 0, dst, 0, src.length);
    for(int i=0; i<dst.length-src.length; i++){
    dst[src.length+i] = src[new Random().nextInt(src.length)];
    }
    //再把dst打乱一下就好了