产生0-10000000随机数,考虑效率

来源:互联网 发布:评价成都软件技术学院 编辑:程序博客网 时间:2024/06/05 22:38

其实我的写法并不是生成随机数,而是生成若干个范围内的随机数,取巧用了多个线程减少重复概率

写了若干个set,最后合并其实并没有必要,只是练手callable用法

package com.mercurylake.test.stack;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Random;import java.util.Set;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import com.google.common.collect.Sets;public class TestRandom implements Callable<Set>{private int min;private int expectnum;private Set<Integer> set=Sets.newHashSetWithExpectedSize(expectnum);public static void main(String[] args) throws InterruptedException, ExecutionException {long begin=System.currentTimeMillis()/1000;Set smain=Sets.newHashSetWithExpectedSize(10000000); List<Future<Set>> results=new ArrayList<Future<Set>>(); ExecutorService exec=Executors.newCachedThreadPool();  for(int i=0;i<10;i++){results.add(exec.submit(new TestRandom(1000000*i,1000000)));}exec.shutdown();          while (true) {              if (exec.isTerminated()) {                  System.out.println("结束了!");                  break;              }              Thread.sleep(200);          }  for(int i=0;i<10;i++){smain.addAll(results.get(i).get());System.out.println(i+":"+smain.size());}long end=System.currentTimeMillis()/1000;System.out.println("end... 消耗时间:"+(end-begin));}public TestRandom(int min,int expectnum){this.min=min;this.expectnum=expectnum;}@Overridepublic Set call() throws Exception { Random random=new Random(); while(set.size()<expectnum){ int i = random.nextInt(expectnum); set.add(i+min);} System.out.println("over:"+set.size());return set;}}


0 0
原创粉丝点击