就是s={a,b,c,d,e}
随机生成相同的数字串,可以字符有重复,但是一定要确保串中每个数字都有出现
请问怎么搞?上次是任意长度的,这次是定长度的,怎么办比如 length=7
就必须是abcedab
or
abdecae
..........
谢谢
随机生成相同的数字串,可以字符有重复,但是一定要确保串中每个数字都有出现
请问怎么搞?上次是任意长度的,这次是定长度的,怎么办比如 length=7
就必须是abcedab
or
abdecae
..........
谢谢
调试欢乐多
String[] letter={"a","b","c","d"};
for (int i = 5; i < 10; i++) {
System.out.println (Test.getRandomString(letter, i));
}
} public static String getRandomString(String[] letter, int length) {
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
sb.append(letter[random.nextInt(4)]);
}
return sb.toString();
}
}
不论定长与否都可以
然后在a到e随机取两个,再在abcde中的六个空随机选两个,
把之前选中的两个元素插入到随机选中的空中。
不固定的也差不多,不过length太大的话这种方法可能效率太低,
期待更好的办法。
package com.mimo.test.reg;import java.util.Random;public class RandomTest { final int KMAX = 7;
char[] s = { 'a', 'b', 'c', 'd', 'e' };
char[] pre = new char[5];
char[] last = new char[KMAX - 5];
char[] t = new char[KMAX];
int[] index = new int[KMAX]; /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
RandomTest rt = new RandomTest();
rt.randomPrePart();
rt.randomLastPart();
rt.merge();
} } public void randomPrePart() {
boolean[] b = new boolean[s.length];
int seed = s.length;
for (int i = 0; i < s.length; i++) {
int r = new Random().nextInt(seed);
int k = r;
while (b[k]) {
k++;
}
pre[i] = s[k];
b[k] = true;
seed--;
}
} public void randomLastPart() {
boolean[] b = new boolean[s.length];
int seed = s.length;
for (int i = 0; i < KMAX - s.length; i++) {
int r = new Random().nextInt(seed);
int k = r;
while (b[k]) {
k++;
}
b[k] = true;
last[i] = s[k];
}
} public void merge() {
boolean[] b = new boolean[KMAX];
int seed = KMAX;
for (int i = 0; i < KMAX - s.length; i++) {
int r = new Random().nextInt(seed);
int k = r;
while (b[k]) {
k++;
}
b[k] = true;
for (int j = 0; j < i; j++) {
if (index[j] > k) {
for (int ll = i - 1; ll >= j; ll--) {
index[ll + 1] = index[ll];
}
index[j] = k;
k = -1;
break;
}
}
if (k > 0) {
index[i] = k;
}
seed--;
}
int j = 0, k = 0;
for (int i = 0; i < KMAX; i++) {
if (i == index[j]) {
t[i] = last[j++];
} else {
t[i] = pre[k++];
}
System.out.print(t[i]);
}
System.out.println(); }
// public char[] random(char[] s, int l) {
//
// if (s.length == l) {
// boolean[] b = new boolean[l];
// int seed = l;
// for (int i = 0; i < l; i++) {
// int r = new Random().nextInt(seed);
// int k = r;
// while (b[k]) {
// k++;
// }
// m[i] = s[k];
// seed--;
// }
// } else if (s.length < l) {
// boolean[] b = new boolean[s.length];
// int seed = s.length;
// for (int i = 0; i < l; i++) {
// int r = new Random().nextInt(seed);
// int k = r;
// while (b[k]) {
// k++;
// }
// last[i] = s[k];
// }
// } else {
//
// }
// return s;
// }}</code>
import java.util.Random;public class RandomTest { final int KMAX = 7;
char[] s = { 'a', 'b', 'c', 'd', 'e' };
char[] pre = new char[5];
char[] last = new char[KMAX - 5];
char[] t = new char[KMAX];
int[] index = new int[KMAX];
public static void main(String[] args) {
//10测测试
for (int i = 0; i < 10; i++) {
RandomTest rt = new RandomTest();
rt.randomPrePart();
rt.randomLastPart();
rt.merge();
} } //得到排列 pre[]
public void randomPrePart() {
boolean[] b = new boolean[s.length];
int seed = s.length;
for (int i = 0; i < s.length; i++) {
int r = new Random().nextInt(seed);
int k = r;
while (b[k]) {
k++;
}
pre[i] = s[k];
b[k] = true;
seed--;
}
}
//得到剩下的字符 last[]
public void randomLastPart() {
boolean[] b = new boolean[s.length];
int seed = s.length;
for (int i = 0; i < KMAX - s.length; i++) {
int r = new Random().nextInt(seed);
int k = r;
last[i] = s[k];
}
}
// 随即位置 ,合并 t[],输出
public void merge() {
boolean[] b = new boolean[KMAX];
int seed = KMAX;
for (int i = 0; i < KMAX - s.length; i++) {
int r = new Random().nextInt(seed);
int k = r;
while (b[k]) {
k++;
}
b[k] = true;
for (int j = 0; j < i; j++) {
if (index[j] > k) {
for (int ll = i - 1; ll >= j; ll--) {
index[ll + 1] = index[ll];
}
index[j] = k;
k = -1;
break;
}
}
if (k > 0) {
index[i] = k;
}
seed--;
}
int j = 0, k = 0;
for (int i = 0; i < KMAX; i++) {
if (i == index[j]) {
t[i] = last[j++];
} else {
t[i] = pre[k++];
}
System.out.print(t[i]);
}
System.out.println(); }
}
改了一下。 楼主可以试一试; 是否满足要求
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] s = { 1, 2, 3, 4, 5 };
int[] ed = new int[s.length];// 整形数组,记录已经输出的数组下标
int length = 7;// 要求输出长度
int i = 0;// 记录已经输出的字符个数
loop: while (i < s.length) {// 查看是否已经输出完毕
int a = (int) (Math.random() * s.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(s[a]);// 输出
}
for(int k=0;k<length-s.length;k++){
int b= (int) (Math.random() * length);
System.out.print(s[b%s.length]);
}
}
}傻瓜型 但是能实现
public class PrintDigitByRandom
{
public static String printAllDigitWithRepeat(int digit[],int maxRondomTimes)
{
int len = digit.length;
if(maxRondomTimes<len)return "maxLength长度不能小于数组长度!"; //
int rand = 0;
byte b[] = new byte[len];
StringBuffer sb=new StringBuffer("");
for(int n=1;n<=maxRondomTimes;n++)
{//确定循环次数
int freeRondomTimes=0; //自由随机次数
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后添加
while(true)
{
rand = (int) Math.floor(Math.random() * len);
if(freeRondomTimes<(maxRondomTimes-len))
{//自由随机
sb.append(digit[rand]+" ");
}
else if(b[rand]==0)
{//指定随机
sb.append(digit[rand]+" ");
b[rand] ++; //统计每个数随机生成出现的次数
}
freeRondomTimes++;
break;
}
}
}
}
return sb.toString();
} public static void main(String[] args)
{
int digit[] = {1,2,3,4,5,6}; //可自己再添加数字
int n=7,maxTimes=7;
for(int i=0;i<n;i++) //测试n次
System.out.println(printAllDigitWithRepeat(digit,maxTimes));
}
}
public class PrintDigitByRandom
{
public static String printAllDigitWithRepeat(int digit[], int maxRondomTimes)
{
int len = digit.length;
if (maxRondomTimes < len)
return "maxRondomTimes不能小于数组长度!";
int rand = 0;
byte b[] = new byte[len];
StringBuffer sb = new StringBuffer(""); for (int n = 1; n <= maxRondomTimes; n++)
{// 确定循环次数
int freeRondomTimes = 0; // 自由随机次数
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);
if (freeRondomTimes < (maxRondomTimes - len))
{// 自由随机
sb.append(digit[rand] + " ");
}
else if (b[rand] == 0)
{// 指定随机
sb.append(digit[rand] + " ");
b[rand]++; // 统计每个数随机生成出现的次数
}
freeRondomTimes++;
}
}
} return sb.toString();
} public static void main(String[] args)
{
int digit[] =
{ 1, 2, 3, 4, 5, 6 }; // 可自己再添加数字
int n = 7, maxTimes = 7;
for (int i = 0; i < n; i++) // 测试n次
System.out.println(printAllDigitWithRepeat(digit, maxTimes));
}
}
freeRondomTimes++;
应该提放到
if (freeRondomTimes < (maxRondomTimes - len))
{// 自由随机}
的代码块中(即大括号中)
假设数组长为n
只等于前length-n个位置产生随机数
后n位置产生一个数组所有数的任意一个排列
例如abcde,length为7
acabccd就产生不了
public class PrintDigitByRandom
{
public static String printAllDigitWithRepeat(int digit[], int maxRondomTimes)
{
int len = digit.length;
if (maxRondomTimes < len)
return "maxRondomTimes不能小于数组长度!";
int rand = 0;
byte b[] = new byte[len];
StringBuffer sb = new StringBuffer(""); int freeRondomTimes = maxRondomTimes - len; // 自由随机次数
for (int n = 1; n <= maxRondomTimes; n++)
{// 确定循环次数
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);
if (freeRondomTimes > 0)
{// 自由随机
sb.append(digit[rand] + " ");
freeRondomTimes--;
} else if (b[rand] == 0)
{// 指定随机
sb.append(digit[rand] + " ");
b[rand]++;
}
}
}
} return sb.toString();
} public static void main(String[] args)
{
int digit[] = { 1, 2, 3, 4, 5 }; // 可自己再添加数字
int n = 20, maxTimes = 9;
for (int i = 0; i < n; i++) // 测试n次
System.out.println(printAllDigitWithRepeat(digit, maxTimes));
}
}
产生得不均匀吧
假设数组长为n
只等于前length-n个位置产生随机数
后n位置产生一个数组所有数的任意一个排列
例如abcde,length为7
acabccd就产生不了
例如abcde,length为7
ecabccd就产生不了
好吧,我明白你的意思。你的意思无非就是觉得那像伪随机数。看这段吧:
public class PrintDigitByRandom
{
public static String printAllDigitWithRepeat(int digit[], int maxRondomTimes)
{
int len = digit.length;
if (maxRondomTimes < len)
return "maxRondomTimes不能小于数组长度!";
int rand = 0;
byte b[] = new byte[len];
StringBuffer sb = new StringBuffer("");
boolean isNext=true;
while(isNext)
{
int i=0;
for (i=0; i < maxRondomTimes; i++)
{
rand = (int) Math.floor(Math.random() * len);
sb.append(digit[rand]+" ");
b[rand]++;
}
for(i=0;i<len;i++)
{
if(b[i]==0)
{//当某一个数出现的次数为0时
sb=new StringBuffer(""); //重置sb
b=new byte[len]; //重置记数数组全为0
break;
}
}
if(i==len) //如果b数组中没有含0的元素,则退出外层循环
isNext=false;
}
//查看各个数出现的次数,楼主可注释掉
for(int j=0;j<len;j++)
System.out.print(b[j]+" ");
return sb.toString();
} public static void main(String[] args)
{
int digit[] = { 1, 2, 3, 4, 5, 6 }; // 可自己再添加数字
int n = 20, maxTimes = 10;
for (int i = 0; i < n; i++) // 测试n次
System.out.println("["+(i+1)+"] "+printAllDigitWithRepeat(digit, maxTimes));
}
}
可以改为
sb.setLength(0);后者好像效率高一点。
不过数量大点,尤其数组大小越接近maxRondomTimes时效率可能会比较低,
就底看运气了,像20,20就挺困难
如果数组大小越接近maxRondomTimes,则就可用我20楼的方法,比较少的时候就用25楼的代码。
毕竟要保证每一个数字都要出现。如果用纯随机的话,那效率自然会低了。
拿到数组以后,随机选取两个数交换位置,重复n回,
n随数组增大而递增,n越大就越均匀。
这方法的缺点就是n相对数组要足够大才能产生均匀的效果,
但可以保证每种序列都有产生的可能,关键看需求了
import java.util.Collections;
public class PrintDigitByRandom { public static void main(String[] args)
{
List<Integer> a = new ArrayList<Integer>();
for ( int i = 0; i < 5; i++)
{
a.add(i+1);
}
int maxlen = 7;
List<Integer> b = new ArrayList<Integer>();
for ( int i = 0; i < a.size(); i++)
{
b.add(a.get(i));
}
//System.arraycopy(a, 0, b, 0, a.length);
for ( int j = a.size(); j < maxlen; j++ )
{
b.add(a.get(new Random().nextInt(a.size())));
}
for ( int j = 0; j < 5; j++)
{
Collections.shuffle(b);
System.out.println(b);
}
}
}
import java.util.*;
import java.util.Collections;public class PrintDigitByRondom
{
public static String functionByGrellen(int digit[], int maxTimes)
{
List<Integer> a = new ArrayList<Integer>();
int len = digit.length;
for (int i = 0; i < len; i++)
{
a.add(digit[i]);
} List<Integer> b = new ArrayList<Integer>();
for (int i = 0; i < len; i++)
{
b.add(a.get(i));
} for (int j = a.size(); j < maxTimes; j++)
{
b.add(a.get(new Random().nextInt(a.size())));
} Collections.shuffle(b); return b.toString();
} public static void main(String[] args)
{
int n = 12, cnt = 5;
int digit[] = new int[n];
for (int i = 0; i < n; i++)
digit[i] = i + 1;
int maxTimes = 13; //小于n的话则在函数中自动以n为准
for (int i = 0; i < cnt; i++)
System.out.println(functionByGrellen(digit, maxTimes));
}
}
源代码我好好看看相助的高手都有分
Thanks !!!
我自己修改了paullbm的算法,也能实现public static String getRandomString(String[] letter, int length) {
Random random = new Random();
byte b[] = new byte[letter.length];
StringBuffer sb = new StringBuffer();
int counter = 0;
while (true) {
boolean flag = false;
for (int i = 0; i < letter.length; i++) {
if (b[i] == 0) {// 0 denotes not used
flag = true;
break;
}
}
if (flag == false && counter >= length)
break;
else {
for (int i = 0; i < length; i++) {
int rand = random.nextInt(letter.length);
sb.append(letter[rand]);
if (b[rand] == 0)
b[rand] = 1;
++counter;
} } }
return sb.toString();
}
import java.util.List;
import java.util.Random;public class RandomTest { //按需要设置范围
public static int RANDOM_RANGE = 10;
public static void main(String[] args) {
//原始数据数组
String[] orgData = {"a", "b", "c", "d", "e"};
//记录已经用过的下标
List<Integer> usedIndex = new ArrayList<Integer>(); //随即产生数据长度并判断
Random needArrLength = new Random();
int ranIntNeedArrLength = needArrLength.nextInt(RANDOM_RANGE);
System.out.println("ranIntNeedArrLength: " + ranIntNeedArrLength); //存储结果的字符串数组
//List<String> result = new ArrayList<String>();
String[] result = new String[ranIntNeedArrLength]; if(orgData.length <= ranIntNeedArrLength) {
Random ranIndex = new Random(); Integer rando = 0;
while(rando < orgData.length) {
int temp = ranIndex.nextInt(ranIntNeedArrLength);
System.out.println("temp: " + temp);
//判断随机到的下标是否重复
boolean has = true;
for (int j = 0; j < usedIndex.size(); j++) {
int usedIndexTemp = usedIndex.get(j);
if(usedIndexTemp == temp) {
has = false;
rando--;
break;
}
}
rando++;
if(has) {
usedIndex.add(temp);
}
}
//输出随机得到的下标
System.out.print("下标: ");
for (int i : usedIndex) {
System.out.print(i + " ");
} //赋值
for (int i = 0; i < orgData.length; i++) {
int a = usedIndex.get(i);
String b = orgData[i];
result[a] = b;
}
//print out result
System.out.println("结果: ");
for (int i = 0; i < result.length; i++) {
System.out.println("xiabiao: " + i + " zhi: " + result[i]);
}
if(ranIntNeedArrLength > orgData.length) {
Random otherInd = new Random();
for(int j = 0; j < result.length; j++) {
if(result[j] == null) {
result[j] = orgData[otherInd.nextInt(orgData.length)];
}
}
}
//print out result
System.out.println("结果: ");
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
}else {
System.out.println("error~~~");
}
}
}运行结果:
ranIntNeedArrLength: 9
temp: 0
temp: 7
temp: 8
temp: 8
temp: 7
temp: 0
temp: 0
temp: 8
temp: 1
temp: 0
temp: 6
下标: 0 7 8 1 6
结果:
xiabiao: 0 zhi: a
xiabiao: 1 zhi: d
xiabiao: 2 zhi: null
xiabiao: 3 zhi: null
xiabiao: 4 zhi: null
xiabiao: 5 zhi: null
xiabiao: 6 zhi: e
xiabiao: 7 zhi: b
xiabiao: 8 zhi: c
结果:
a d c e c b e b c ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820]