public static void main(String[] args) { int n = 10000000, k = 1000000; boolean[] appear = new boolean[n]; Random r = new Random(); int[] nums = new int[k]; for (int i = 0; i < k; i++) { int j = -1; while (appear[j = r.nextInt(n)]); nums[i] = j; //appear[j] = true;System.out.println(nums[i]); } }
public static void main(String[] args) { int n = 10000000, k = 1000000; int[] arr = new int[n]; for (int i = 0; i < n; i++) arr[i] = i; Random r = new Random(); int[] nums = new int[k]; for (int i = 0; i < k; i++) { int j = r.nextInt(n - i) + i; nums[i] = arr[j]; arr[j] = arr[i]; } }再来一个……
楼主的意思就是生成1-n随机的整数吧?方法很多的 package com;import java.util.ArrayList; import java.util.List;public class Test4 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List list = new ArrayList<Integer>(); for (int i = 1; i <= 54; i++) { list.add(i); }
while (list.size() > 0) { int size = list.size(); int r = (int) (java.lang.Math.random() * size); System.out.println(list.get(r)); list.remove(r); } }}
数字大了就有点扛不住了 给大家都看看吧 import java.lang.Math; import java.util.Vector; import java.util.Random; public class Test { final static int k=100; int num=-1; public Test(int num) { this.num=num; } public int getnum() { return this.num; } public void setnum(int num) { this.num=num; } public static void main(String[] args) { Vector v=new Vector(); Vector r=new Vector(); for(int i=0;i<k;i++) { v.addElement(new Test(i)); } do { Random generator = new Random(); int n = generator.nextInt(v.size()); Test tn=(Test) v.elementAt(n); if(v.contains(tn)) { int h=tn.getnum(); v.remove(n);
三楼兄弟的估计有点占内存和时间public static void main(String[] args) { long start = System.currentTimeMillis(); int n = 10000000; int k = 9000000; Set<Integer> set = new HashSet<Integer>(); Random rand = new Random(); while (set.size() < k) { set.add(rand.nextInt(n)); } System.out.println("set's size :" + set.size()) ; System.out.println(System.currentTimeMillis() - start); }Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.HashMap.addEntry(HashMap.java:753) at java.util.HashMap.put(HashMap.java:385) at java.util.HashSet.add(HashSet.java:200) at chapter1.CreateRandomNum.main(CreateRandomNum.java:19)用泛型和不用泛型都试了。
终于搞懂你意思了package com;import java.util.ArrayList; import java.util.List;public class Test2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List list = new ArrayList<Integer>(); for (int i = 1; i <= 10000000; i++) { list.add(i); } while (list.size() > 9000000) { int size = list.size(); int r = (int) (java.lang.Math.random() * size); System.out.println(list.get(r)); list.remove(r); } }}
非常感谢这位热心的兄弟,上周我看了你的回复,也运行了你的程序,确实花费的时间很短,而且没有内存溢出。public static void main(String[] args) { long start = System.currentTimeMillis(); int n = 10000000; int k = 1000000; boolean[] appear = new boolean[n]; Random rand = new Random(); int [] jj = new int [k]; for (int i = 0 ; i < k ; i ++) { int j = -1 ; while (appear[j = rand.nextInt(n)]); jj[i] = j; appear[j] = true; }
public static int[] getRandom() { int n = 10000; int k = 9000; boolean[] appear = new boolean[n]; Random random = new Random(); int result[] = new int[k]; for (int i = 0; i < k; i++) {
int a = random.nextInt(n); if (appear[a]==false) { result[i] = a; appear[a] = true; } } return result; }
import java.util.List;public class B { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList<Integer>();
for(int i=1;i<=10000000;i++){
list.add(i);
}
long start=System.currentTimeMillis();
java.util.Collections.shuffle(list);
System.out.println(System.currentTimeMillis()-start);
}}
添加到set中
如果set的size()小于n-1就继续调用此方法
int n = 10000000, k = 1000000;
boolean[] appear = new boolean[n];
Random r = new Random();
int[] nums = new int[k];
for (int i = 0; i < k; i++) {
int j = -1;
while (appear[j = r.nextInt(n)]);
nums[i] = j;
//appear[j] = true;System.out.println(nums[i]);
}
}
int n = 10000000, k = 1000000;
int[] arr = new int[n];
for (int i = 0; i < n; i++)
arr[i] = i;
Random r = new Random();
int[] nums = new int[k];
for (int i = 0; i < k; i++) {
int j = r.nextInt(n - i) + i;
nums[i] = arr[j];
arr[j] = arr[i];
}
}再来一个……
package com;import java.util.ArrayList;
import java.util.List;public class Test4 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList<Integer>(); for (int i = 1; i <= 54; i++) {
list.add(i);
}
while (list.size() > 0) {
int size = list.size();
int r = (int) (java.lang.Math.random() * size);
System.out.println(list.get(r));
list.remove(r);
}
}}
随机生成一个小于n的数,作为行号去文件里取,取后删除同时n-1如果不考虑n的大小,用Collection.shuffle内存乱序一下即可。
import java.lang.Math;
import java.util.Vector;
import java.util.Random;
public class Test
{
final static int k=100;
int num=-1;
public Test(int num)
{
this.num=num;
}
public int getnum()
{
return this.num;
}
public void setnum(int num)
{
this.num=num;
}
public static void main(String[] args)
{
Vector v=new Vector();
Vector r=new Vector();
for(int i=0;i<k;i++)
{
v.addElement(new Test(i));
}
do
{
Random generator = new Random();
int n = generator.nextInt(v.size());
Test tn=(Test) v.elementAt(n);
if(v.contains(tn))
{
int h=tn.getnum();
v.remove(n);
r.addElement(new Test(h));
}
}while(r.size()<k); //System.out.println(r.size());
for(int j=0;j<r.size();j++)
{
Test tj=(Test)r.elementAt(j);
System.out.println(tj.getnum());
}
}
}
n = 10000000(一千万) ,求k个0至n之间的随机数,随机数小于n,求出的数据没有重复。
三楼兄弟的估计有点占内存和时间public static void main(String[] args) {
long start = System.currentTimeMillis();
int n = 10000000;
int k = 9000000;
Set<Integer> set = new HashSet<Integer>();
Random rand = new Random();
while (set.size() < k) {
set.add(rand.nextInt(n));
}
System.out.println("set's size :" + set.size()) ;
System.out.println(System.currentTimeMillis() - start);
}Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.addEntry(HashMap.java:753)
at java.util.HashMap.put(HashMap.java:385)
at java.util.HashSet.add(HashSet.java:200)
at chapter1.CreateRandomNum.main(CreateRandomNum.java:19)用泛型和不用泛型都试了。
import java.util.List;public class Test2 { /**
* @param args
*/ public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList<Integer>(); for (int i = 1; i <= 10000000; i++) {
list.add(i);
}
while (list.size() > 9000000) {
int size = list.size();
int r = (int) (java.lang.Math.random() * size);
System.out.println(list.get(r));
list.remove(r); }
}}
你可以看下6楼和8楼我的两个解法
6楼的方法是将每个数是否已出现存入布尔数组,如果已出现则对应项设为true,然后随机时如果随即到的项已经是true则继续直到随机到的项为false为止
8楼的方法是将所有数存入整数数组,如果第i次随机到某数则将它与第i项交换,随机范围是i到n-1,i的范围从0到k-1,也就是重复执行k次
非常感谢这位热心的兄弟,上周我看了你的回复,也运行了你的程序,确实花费的时间很短,而且没有内存溢出。public static void main(String[] args) {
long start = System.currentTimeMillis();
int n = 10000000;
int k = 1000000;
boolean[] appear = new boolean[n];
Random rand = new Random();
int [] jj = new int [k];
for (int i = 0 ; i < k ; i ++) {
int j = -1 ;
while (appear[j = rand.nextInt(n)]);
jj[i] = j;
appear[j] = true;
}
System.out.println("jj'length:" + jj.length);
System.out.println(System.currentTimeMillis() - start);
}
一般运行时间在100-200毫秒之间。再次感谢。
{
int n = 10000;
int k = 9000;
boolean[] appear = new boolean[n];
Random random = new Random();
int result[] = new int[k];
for (int i = 0; i < k; i++)
{
int a = random.nextInt(n);
if (appear[a]==false)
{
result[i] = a;
appear[a] = true;
}
}
return result;
}
这种方法确实可以,但依赖于java 的set容器,数据量多的话,耗内存比较多。速度也比较慢。
比如我指定n=100,我想随机生成k=80个随机数, 每个随机数都在0---n之间,生成的随机数序列不能有重复的。n和k数值比较小的时候还好,当n=一千万,k=几百万时,要考虑速度和性能。