产生一个1-12的不重复的随机数

import java.util.ArrayList;
import java.util.Random;
public class Test {

 public static void main(String[] args) {
  Test test = new Test();
  for ( int n = 2 ;n < 20; n++){
   int[] r = test.myRand(n);
   System.out.println( n + ": " + test.arrayToString(r,", "));
  }
  
 }
 
 public int[] myRand(int n){
  int[] result = new int[n];
  
  ArrayList al = new ArrayList();
  for ( int i = 1; i <= n; i++ ){
   al.add( new Integer(i));   
  }
  
  //
  for ( int i = 0; i < n; i++){
   Random r = new Random();
   int index = r.nextInt(n-i);
   Object o = al.get(index);
   result[i] = ((Integer)o).intValue();
   
   // remove
   al.remove(index);
  }
  
  return result;
 }
 
 // print int[]
 private String arrayToString( int[] intArray, String strSeparator){
  StringBuffer sb = new StringBuffer();
  if( strSeparator == null ) strSeparator = ",";
  int i = 0;
  for( i = 0; i < intArray.length-1; i++){
   sb.append( intArray[i] + strSeparator );
  }  
  sb.append( intArray[i]);
  
  // return
  return sb.toString();
 }
}

///

以下是网友提供的思路

//

提供思路
用java的随机方法生成一个数字,然后mod 12,如果和前面的数值有相同的,那么抛弃这个数值,否则保存,直到数组中有12个数为止。

还有一种方法可以这样实现:定义一个数组,长度为输入的数组的长,在得到输入的整数,即其长度时进行初始化,a[0]=1,a[1]=2,a[2]=3,......,a[11]=12。然后生成的数组为b[12],用随机函数产生1到12的整数,作为a数组的下标,然后顺序赋值给b数组,赋值过的a就讲其值置为0,每次在赋值b之前检查这个a是不是0,不是则赋值,是则再得到另外一个a。这比上一个算法应该好点吧。

还有一个就是每次mod的时候都减少一个数值
比如第一次mod 12,第二此mod 11………………这样的话可以每次mod都得到一个数值
但是每次都要对原先的数组进行重新排列,这样就保证每次都可以得到一个随机数,不会浪费太多的时间了。

这个方法是上述第二个算法的改进。


//
我有一个方法,供参考:
1,产生一个数组,数组大小为输入的数据nInput,数组初始值为-1 ,i=1
2,产生一个随机数,%nInput,将如果对应元数小于0,那么将对应下标元数设为i,否则向后查找到一 个小于0的元数
3,重复上述过程,i++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值