如何随机挑选数组中的元素,而且保证每个元素都被选过? 就是s={1,2,3,4,5}随机生成任意长度的数字串,可以有重复,但是一定要确保串中每个数字都有出现请问怎么搞?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这思路可以么?字符串值对应一个key值,比如flag,默认=ralse,随机取值,如果选中,置true,然后在剩下的key=false的里面再随即取值,取值过程同前面。 然后在剩下的key=false的里面再随即取值,取值过程同前面。-----------》这个如何实现? 这题比较简单啊,就以楼主的5个数字来说吧s={1,2,3,4,5}那么,同时声明一个和s长度一样的byte类型的数组b,初始值默认都为0。用以存放s中对应下标的数字字符是否出现过!!比如说,通过随机函数(控制范围则是s或b的下标范围),将会得到一个下标数,如果该下标所对应的数字为1,则重新随机取数;为0的话则直接将s中对应下标的数字字符打印出来,并将b对应下标的数置1.如此循环即可。PS:为了避免随机数尽可能重复,你可以在取随机数时加入一个时间种子以降低随机数的重复的可能性! 字符串可以有重复,把它当key是不可以的 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); } 这样?呵呵 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数组中所有数字都至少访问一次! 另外一个帖子已经回复过的楼主觉得这样不好吗:随机生成四个大于0的整数,组成字符串: a...ab...bc...cd...d 然后随机排序 不太理解楼主的意思。可以有重复,有都出现。不清楚楼主要重复多少次,满足上面的条件。如果重复次数很多的话, java自带的Random就是可以啊(本身Random就是这个含义) 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]);//输出 }没工具,手写的 不知道是不是有错,自己查查吧 或者将楼主的需求直接写在一个函数,如下: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)); }} 谢谢各位指点尤其是paullbm的代码zhyanl的代码思路也对。 其实很简单首先为了确保都出现,把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打乱一下就好了 想创建一个有各种部件的窗口,一直没看出问题,可总出错,请哪位高手指点一下。。。 关于JDK包里自带方法调用的迷惑~ 关于虚拟机不能关闭的问题 用javascrip编写一个验证的程序 关于TCP方式socket的多线程 求助:Java接口直接作为成员变量运行的问题 关于"给出字符串表达式,自动计算结果"的JAVA源代码 线程 graphics对象为空? 如何对文本中的单个String进行着色? 接口继承的程序怎么写啊?大家帮我看看这个小程序 帮我分析一个小程序
s={1,2,3,4,5}
那么,同时声明一个和s长度一样的byte类型的数组b,初始值默认都为0。用以存放s中对应下标的数字字符是否出现过!!比如说,通过随机函数(控制范围则是s或b的下标范围),将会得到一个下标数,如果该下标所对应的数字为1,则重新随机取数;为0的话则直接将s中对应下标的数字字符打印出来,并将b对应下标的数置1.
如此循环即可。PS:为了避免随机数尽可能重复,你可以在取随机数时加入一个时间种子以降低随机数的重复的可能性!
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);
} 这样?呵呵
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数组中所有数字都至少访问一次!
a...ab...bc...cd...d
然后随机排序
可以有重复,有都出现。
不清楚楼主要重复多少次,满足上面的条件。如果重复次数很多的话, java自带的Random就是可以啊(本身Random就是这个含义)
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]);//输出
}没工具,手写的 不知道是不是有错,自己查查吧
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));
}
}
zhyanl的代码思路也对。
首先为了确保都出现,把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打乱一下就好了