int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; int result = 0; Random random = new Random(); for (int i = 0, len = 8, index = 0; i < 4; i++) { index = random.nextInt(len); result = result * 10 + array[index]; array[index] = array[len-- + 1]; } System.out.println("result -> " + result);
更正一下: int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; int result = 0; Random random = new Random(); for (int i = 0, len = 9, index = 0; i < 4; i++) { index = random.nextInt(len); result = result * 10 + array[index]; array[index] = array[len--]; } System.out.println("result -> " + result);Random类选随机数的范围也是[ )样的。
用Random随机一个数r,然后另外三个数就是r+1、r+2和r+3行不?嘻嘻
public static void main(String[] args) { { while (true) { int a = (int) (Math.random() * 10000 + 1000); if (a > 9999) continue; else { int[] b = new int[] { (a / 1000), (a / 100) - (a / 1000) * 10, ((a % 100) - a % 10) / 10, a % 10 }; if (b[0] == b[1]) continue; else if (b[0] == b[2]) continue; else if (b[0] == b[3]) continue; else if (b[1] == b[2]) continue; else if (b[1] == b[3]) continue; else if (b[2] == b[3]) continue; else { System.out.println(a); break; } } } } }
方法2 public static void main(String[] args) { { while (true) { int a = (int) (Math.random() * 10000 + 1000); if (a > 9999) continue; else { int[] b = new int[] { (a / 1000), (a / 100) - (a / 1000) * 10, ((a % 100) - a % 10) / 10, a % 10 }; if (b[0] == b[1]) continue; else if (b[0] == b[2]) continue; else if (b[0] == b[3]) continue; else if (b[1] == b[2]) continue; else if (b[1] == b[3]) continue; else if (b[2] == b[3]) continue; else { System.out.println(a); break; } } } } }
我这个测试过的啦,没问题的package com.gzsoft.zoom;import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set;public class TestSIWEISHU { public static void main(String[] args) { Random rand=new Random(); List set=new ArrayList(); set.add(0); for(int i=0;i<10;i++){ set.add(new Integer(i)); }
2.产生0~9的随机数,同样第一位不为0,需要进行重复比较,如果重复则重新取随机数
3.想不到了....
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int result = 0;
Random random = new Random();
for (int i = 0, len = 8, index = 0; i < 4; i++) {
index = random.nextInt(len);
result = result * 10 + array[index];
array[index] = array[len-- + 1];
}
System.out.println("result -> " + result);
int result = 0;
Random random = new Random();
for (int i = 0, len = 9, index = 0; i < 4; i++) {
index = random.nextInt(len);
result = result * 10 + array[index];
array[index] = array[len--];
}
System.out.println("result -> " + result);Random类选随机数的范围也是[ )样的。
while (true) {
int a = (int) (Math.random() * 10000 + 1000); if (a > 9999)
continue;
else {
int[] b = new int[] { (a / 1000),
(a / 100) - (a / 1000) * 10,
((a % 100) - a % 10) / 10, a % 10 };
if (b[0] == b[1])
continue;
else if (b[0] == b[2])
continue;
else if (b[0] == b[3])
continue;
else if (b[1] == b[2])
continue;
else if (b[1] == b[3])
continue;
else if (b[2] == b[3])
continue;
else {
System.out.println(a);
break;
} }
} }
}
while (true) {
int a = (int) (Math.random() * 10000 + 1000); if (a > 9999)
continue;
else {
int[] b = new int[] { (a / 1000),
(a / 100) - (a / 1000) * 10,
((a % 100) - a % 10) / 10, a % 10 };
if (b[0] == b[1])
continue;
else if (b[0] == b[2])
continue;
else if (b[0] == b[3])
continue;
else if (b[1] == b[2])
continue;
else if (b[1] == b[3])
continue;
else if (b[2] == b[3])
continue;
else {
System.out.println(a);
break;
} }
} }
}
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;public class TestSIWEISHU {
public static void main(String[] args) {
Random rand=new Random();
List set=new ArrayList();
set.add(0);
for(int i=0;i<10;i++){
set.add(new Integer(i));
}
int beishu=1;
int result=0;
for(int i=0;i<4;i++){
int ranNum=rand.nextInt(9-i);
Integer in=(Integer) set.get(ranNum);
set.remove(in);
result+=in*beishu;
beishu=beishu*10;
if(i==2){
set.remove(new Integer(0));
}
}
System.out.print(result);
}}
//这行要注释掉的!
Random rand=new Random();
List<Integer> set=new ArrayList<Integer>();
for(int i=0;i<10;i++){set.add(new Integer(i));}
int beishu=1;
int result=0;
for(int i=0;i<4;i++){
Integer in= set.get(rand.nextInt(9-i));
set.remove(in);
result+=in*beishu;
beishu*=10;
if(i==2){set.remove(new Integer(0));}
}
System.out.println(result);
}
1、选择区域缩小法:
定义一个数组array{0,1,2,3,4,5,6,7,8,9},用Random(array.length)函数选择下标i,读取array[i]做第一位,移除array[i],再用Random(array.length-1)选择下标i,读取array[i]做第二位,移除array[i]依次类推。。
时间复杂度为 T(n) = O(4)
2、冲突检查规避法:
用Random(10),取出第一位r1,再用Random(10)取出第二位,判断是否等于第一位,是重新获取。否则做第2位依次类推
最好时间复杂度 T(n) = O(4)//无冲突的情况
平均时间复杂度 T(n) = O(4(1+1/4));
最坏时间复杂度 T(n) = O(无穷大)//每次都冲突的情况
由于Random函数产生的随机数是均匀分布的,所以最坏情况的出现率基本不会出现。
3、绝对值冲突检查调整法:
用Random(10),取出第一位r1,再用Random(10)取出与第二位的差值 x1 ,用(r1+x1)%10做第二位,再用Random(10)取出与第三位的差值 x2,看x2是否和x1相等如果是重新获取x2,否则用(r1+x2)%10做第三位,依次类推
时间复杂度同2;
4,定义数组array,遍历0000——9999检查两位是否相等如果每一位都不相等,填入到array,用Random(array.leng)获取结果
时间复杂度同 T(n) = O(10001)产生非均匀分布的算法(这个比较扯)
1、用Random(10),取出第一位r1,(r1+1)%10做第二位,(r1+2)%10做第三位,(r1+3)%10做第四位
时间复杂度为 T(n) = O(1)
其他你可以发挥,不过这个比较扯。