-2

我需要在 6 个不同的编辑文本中生成随机数。不幸的是,随机数重复了。我需要我设置的范围内的唯一数字。

        rndNumber = rndNumbers.nextInt(max);
        num1.setText(Integer.toString(rndNumber));


        rndNumber = rndNumbers.nextInt(max);
        num2.setText(Integer.toString(rndNumber));

        rndNumber = rndNumbers.nextInt(max);
        num3.setText(Integer.toString(rndNumber));

        rndNumber = rndNumbers.nextInt(max);
        num4.setText(Integer.toString(rndNumber));

        rndNumber = rndNumbers.nextInt(max);
        num5.setText(Integer.toString(rndNumber));

        rndNumber = rndNumbers.nextInt(max);
        num6.setText(Integer.toString(rndNumber));
4

5 回答 5

2

包装随机数生成器以将结果存储在一个集合中。当您生成一个数字(如果它存在于集合中)时,请再次执行此操作:

其他人对 for 循环的评论也是有效的......

伪代码:

class MyRandomNums {
    Set<Integer> usedNums;

    public int getRandom()
    {
        int num = random.nextInt();
        while(usedNums.contains(num)) {
            num = random.nextInt();
        }
        usedNums.add(num);
        return num;
    }

    public int reset()
    {
        usedNums.clear();
    }
}
于 2013-06-20T03:05:35.797 回答
0

对于字母数字试试这个

public String getRandomNum(int randomLength)
{   
    return new BigInteger(130, random).toString(32).toUpperCase().substring(0, randomLength);
}

如果你只想要数字随机数试试这个

public String getRandomNum(int randomLength)
{
    int value = (int)(Math.random() * 9999);
    String format = "%1$0"+randomLength+"d";
    String randomNum = String.format(format, value);
    return randomNum;
}
于 2013-06-20T03:48:35.333 回答
0

这是完成您提到的所有事情的一种方法:

private static boolean arrayContainsInt(int array[], int val, int x) {
    for(int i = 0; i < x; i++) {
        if(array[i] == val) {
            return true;
        }
    }
    return false;
}

public static int[] randomNumbers(int count, int minInclusive, int maxNonInclusive) {
    int randoms[] = new int[count];
    Random rand = new Random();
    int impossibleValue = minInclusive - 1;
    for(int i = 0; i < randoms.length; i++) {
        randoms[i] = impossibleValue;
    }
    for(int x = 0; x < count; x++) {
        int thisTry = impossibleValue;
        while(thisTry == impossibleValue || arrayContainsInt(randoms, thisTry, x)) {
            thisTry = (int)(rand.nextFloat() * (float)(maxNonInclusive - minInclusive)) + minInclusive;
        }
        randoms[x] = thisTry;
    }
    return randoms;
}

如果您想知道速度,这里有一些统计数据:

randomNumbers(1000, 0, 10000)==> 16 毫秒

(1000 个随机数。从 0->10,000 无重复)

randomNumbers(10000, 0, 10000)==> 207 毫秒

(从 0->10,000 的每个数字以随机顺序生成)

randomNumbers方法提供要生成的随机整数的数量、最小值(包括)和最大值(不包括),并在给定参数的情况下返回一个随机数组。

注意:如果count提供的参数大于 的值,maxNonInclusive - minInclusive那么它将无限循环,只是因为您无法提供比范围提供的更多的整数。

此外,arrayContainsIntx参数作为数组中最大索引后的值发送以进行检查,因为仅x填充了数组的许多元素,因此检查其余元素是没有意义的。

于 2013-06-20T03:26:10.747 回答
0

你所有的for循环循环一次。为什么:

for (int nbr = 1; nbr < 2; nbr++) {
    rndNumber = rndNumbers.nextInt(max);
    num1.setText(Integer.toString(rndNumber));
}

当您可以这样做时:

rndNumber = rndNumbers.nextInt(max);
num1.setText(Integer.toString(rndNumber));

?

于 2013-06-20T03:12:40.920 回答
0
int min = 0;
int max = 100;
List<Integer> randoms = new ArrayList<Integer>();
for(int i = min; i <= max; i++) randoms.add(i);
Collections.shuffle(randoms);

然后你可以像这样使用它:

int randomNumber = randoms.remove(0);
于 2013-06-20T03:24:29.610 回答