Java中没有重复类的随机数生成器

时间:2013-09-17 00:53:26

标签: java android random

首先,我是一名新手Android App开发者。在我的应用程序中,我需要一个在给定范围内生成随机数的类,以避免重复。我已经搜索了很多这个问题,但我没有找到任何具体的解决方案。嗯,以为我发现了一个我稍微重读的东西,但它没有正常工作。代码如下:

public class NoRepeatRandom {

  private int[] number = null;
  private int N = -1;
  private int size = 0;
  public NoRepeatRandom(int minVal, int maxVal)
  {
    N = (maxVal - minVal) + 1;
    number = new int[N];
    int n = minVal;
    for(int i = 0; i < N; i++)
      number[i] = n++;
    size = N;
  }

  public void Reset() { size = N; }

   // Returns -1 if none left
  public int GetRandom()
  {
    if(size <= 0) return -1;
    int index = size * (int)Math.random();
    int randNum = number[index];

    // Swap current value with current last, so we don't actually
    // have to remove anything, and our list still contains everything
    // if we want to reset
    number[index] = number[size-1];
    number[--size] = randNum;

    return randNum;
  }
}

当我调用GetRandom()时,我没有达到预期的结果,因为它总是返回给定范围的最小数量。例如:

NoRepeatRandom nrr = new NoRepeatRandom(0, 10);
int yes = nrr.GetRandom();
//Here I create a Toast just to see the numbers that the method is returning.    
Toast toast = Toast.makeText(MainActivity.this, Integer.toString(yes), Toast.LENGTH_SHORT);
toast.show();

结果是:0,0,0,0,0,0 .... 对于范围(5,10),结果是5,5,5,5 ....

有人知道代码有什么问题吗?我真的很感激任何帮助!

提前谢谢。

2 个答案:

答案 0 :(得分:2)

我想这一行是个问题。

int index = size * (int) Math.random();

此评估始终为

修改

只是整合来自Jeroen Vannevel和OP的评论。

Math.random()将返回介于0.0和1.0之间的值,当使用(int)进行转换时,将始终求值为零。你可以使用如下。

int index = (int) (size * Math.random());

答案 1 :(得分:1)

您应该尝试使用Random类:

http://developer.android.com/reference/java/util/Random.html

Random random = new Random();
int randomNo = random.nextInt(10);  // 0 to 9