Android随机数

时间:2013-10-16 18:51:15

标签: java android

我试图得到6个随机数,但它有效,但有时它们中的一些是相同的。我可以添加什么来检查随机数1 =随机数2然后改变?

    public void onClick(View v) {
         Random r1 = new Random();
         Random r2 = new Random();
         Random r3 = new Random();
         Random r4 = new Random();
         Random r5 = new Random();
         Random r6 = new Random();

         int i1=r1.nextInt(46-1) + 1; 
         int i2=r2.nextInt(46-1) + 1; 
         int i3=r3.nextInt(46-1) + 1; 
         int i4=r4.nextInt(46-1) + 1; 
         int i5=r5.nextInt(46-1) + 1; 
         int i6=r6.nextInt(46-1) + 1; 

         EditText edit1=(EditText)findViewById(R.id.edit1);
         edit1.setText(String.valueOf(i1));
         EditText edit2=(EditText)findViewById(R.id.edit2);
         edit2.setText(String.valueOf(i2));
         EditText edit3=(EditText)findViewById(R.id.edit3);
         edit3.setText(String.valueOf(i3));
         EditText edit4=(EditText)findViewById(R.id.edit4);
         edit4.setText(String.valueOf(i4));
         EditText edit5=(EditText)findViewById(R.id.edit5);
         edit5.setText(String.valueOf(i5));
         EditText edit6=(EditText)findViewById(R.id.edit6);
         edit6.setText(String.valueOf(i6));

6 个答案:

答案 0 :(得分:2)

private Set<Integer> getRandoms(int max) {
  Set<Integer> randoms = new HashSet<Integer>();
  Random r = new Random();
  while (randoms.size() != max) {
    int possibleNumber = r.nextInt(46-1) + 1;
    randoms.add(possibleNumber); // This will check to see if the element is already there
  }
  return randoms;
}

这将确保您没有重复项。

答案 1 :(得分:1)

首先,在彼此之后创建6个Random是非常糟糕的做法,因为它们使用当前时间来播种随机生成器。所以,如果你有一个快速的CPU,也许一些randoms可能有相同的种子,并将产生相同的数字。为了解决这个问题,请创建一个随机的并使用那个。

更新:我查看了Random构造函数的代码,我看到它使用System.nanoTime()来播种。这应该在你从一个Random构造函数到另一个构造函数的时候更新 更新II: @nandeesh 表示Android中的Random使用System.currentTimeMillis() + System.identityHashCode(this)。这是以毫秒为单位的时间加上Java对象的内存地址。如果你可以在同一毫秒内创建两个Random,我不确定获得不同数字是多么安全。

其次,要修复重复项(这是真的可能),只需将随机数放在一个数组中,每次添加一个,检查它是否已存在于以前的数组中。做类似的事情:

int num = 6;
int[] randoms = new int[num];
Random r = new Random();
outer:
for (int i = 0; i < num; ++i)
{
   int rand = r.nextInt(45) + 1;
   for (int j = 0; j < i; ++j)
   {
       if (randoms[j] == rand)
       {
           --i;
           continue outer;
       }
   }
   randoms[i] = rand;
}

答案 2 :(得分:1)

如果您想避免重复,请创建45种可能性的列表,将其随机播放(Collections.Shuffle)并取第6个。

List<Integer> numbers = new ArrayList<>();
for(int i = 0; i < 45; i++){
    numbers.add(i);
}

Collections.shuffle(numbers);

for(int i = 0; i < 6; i++) {
 System.out.println(numbers.get(i));
}

如果您不介意重复,请仅使用一个Random实例并将其调用6次。

答案 3 :(得分:0)

尝试在Random构造函数中使用“seed” 如

     Random r1 = new Random(10);
     Random r2 = new Random(100);
     int num1 =r1.nextInt(45);
     int num2 =r2.nextInt(45);

通常认为让6个随机对象做同样的事情是不好的做法。代码可以缩减为

     Random r1 = new Random(10);
     int num1 =r1.nextInt(45);
     int num2 =r1.nextInt(45);

答案 4 :(得分:0)

这就是你想要的:

  public void onClick(View v) {
     ArrayList<Integer> list = new ArrayList();      
     Random r = new Random();// one time is enough

     for(int i = 0; i< list.size(); i++){//loop through the list of integers
         int temp = r.nextInt(45) + 1; //save te random int.

         for(int j = 0; i< list.size(); j++){//loop through te list of int to chec if it exists
             if(temp == list.get(j)) {return;}//if exists stop.
         }
         list.add(temp);//save
     }


     EditText edit1=(EditText)findViewById(R.id.edit1);
     edit1.setText(String.valueOf(list.get(0)));
     EditText edit2=(EditText)findViewById(R.id.edit2);
     edit2.setText(String.valueOf(list.get(1)));
     EditText edit3=(EditText)findViewById(R.id.edit3);
     edit3.setText(String.valueOf(list.get(2)));
     EditText edit4=(EditText)findViewById(R.id.edit4);
     edit4.setText(String.valueOf(list.get(3)));
     EditText edit5=(EditText)findViewById(R.id.edit5);
     edit5.setText(String.valueOf(list.get(4)));
     EditText edit6=(EditText)findViewById(R.id.edit6);
     edit6.setText(String.valueOf(list.get(5)));
 }

答案 5 :(得分:-2)

这个怎么样?

   int numberOfnumbers = 1000;

   List<Integer> numbers = new ArrayList<Integer>();

   for (int i = 0; i < numberOfNumbers; i++) {
       numbers.add(i);
     }

   Collections.shuffle(numbers);

尽可能多的数字,随机并保证不重复。只需要前6个,或者你需要多少。