2017-09-13 52 views
0

我想生成一个范围内的数字。例如1到10,不要重复那些已经生成的。生成一个数字排除一些android按钮点击

int[] ex = {}; 
Random rnd = new Random(); 

我的点击按钮生成数字:

 public void onClick(View v) { 

      String f = from.getText().toString(); 
      int ff = Integer.parseInt(f); 
      String t = to.getText().toString(); 
      int tt = Integer.parseInt(t); 

      int val = getRandomWithExclusion(ff, tt, ex); 
      String item = Integer.toString(val); 
      Toast.makeText(MainActivity.this, item, Toast.LENGTH_SHORT).show(); 

      ex = add(ex, val); 
      Log.d("this is my array", "arr: " + Arrays.toString(ex)); 

     } 

添加可生成的号码添加到EX []功能:

public static int[] add(int[] initialArray , int newValue) { 
    int[] newArray = new int[initialArray.length + 1]; 
    System.arraycopy(initialArray, 0, newArray, 0, initialArray.length); 
    newArray[newArray.length - 1] = newValue; 
    return newArray; 
} 

的主要活动

和不工作的功能(它重复数字,并在10次尝试后(1到10的范围)它显示了一个致命的例外:

public int getRandomWithExclusion(int start, int end, int... exclude){ 
    int rangeLength = end - start - exclude.length; 
    int randomInt = rnd.nextInt(rangeLength) + start; 

    for (int anExclude : exclude) { 
     if (anExclude > randomInt) { 
      return randomInt; 
     } 

     randomInt++; 
    } 

    return randomInt; 
} 

为什么它重复号码?为什么10次后的按钮点击(范围为1〜10),它显示了一个异常

java.lang.IllegalArgumentException异常:n必须是正

回答

1

听起来好像不是试图产生一种更好的方法一个尚未生成的随机数将会创建一个有效(唯一)值列表,然后随机化列表。

List<String> numbers = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); 
Collections.shuffle(numbers); 

现在列表将会是例如[7, 6, 1, 5, 10, 3, 9, 4, 8, 2],你可以简单地迭代它。

+0

谢谢你的回答!例如,如果用户想要生成一个1到500之间的数字,在这个解决方案中,我需要做一个1到500的数组添加数组?它不会让应用程序崩溃或变慢吗? –

+1

如果500(甚至5000)'String's会减慢你的应用程序,我会感到非常惊讶。当然,如果你使用了足够多的应用程序,你可能会崩溃你的应用程序,但是我怀疑任何合理的数字都会让你失望。 –

+1

我刚刚尝试了五百万个'String's,它花了1.5秒钟来生成列表,另外1.5秒来洗牌。五百个字符串需要0.5毫秒的时间才能生成。 –