如何防止在随机int中生成一个值? (JAVA)

时间:2016-11-19 21:49:47

标签: java android random

我有两个随机生成的变量。 LoadG4输出到一个按钮,其他3个按钮对于生成的randoms1具有不同的值。我的目标是确保随机生成的randoms1的值不等于LoadG4。例如,如果范围在0到9之间,而LoadG4最终为3,则randoms1.nextint中的其他随机数不能为3.例如,它们可以是7,4或5,但不一样LoadG4。

这是我的代码:

Random GenerateG4 = new Random();
            int loadG4 = GenerateG4.nextInt(10);
            Random randoms1 = new Random();
            final TextView number = (TextView) findViewById(R.id.number);
            number.setText(""+loadG4);
            for(int allrbA=0; allrbA<4; allrbA++) {
                selectrb[allrbA].setText(""+randoms1.nextInt(10));
            }
            selectrb[rbselector].setText(""+loadG4);

我怎么能这样做?

非常感谢提前。

更新代码:

if (rbvalue==loadG4) {
                    int realrbvalue = rbvalue++;
                    selectrb[allrbA].setText(""+realrbvalue);
                }
                else {
                    selectrb[allrbA].setText(""+rbvalue);
                }
            }

为什么这仍然不起作用?

3 个答案:

答案 0 :(得分:1)

以下内容应该让您走上正轨。我们的想法是,对于第二次提取,我们将范围缩小一。如果提取的数字小于先前提取的数字,那就很好。如果没有,那么我们向它添加1以获得范围[v1 + 1,n]中的数字:

Random r = new Random();
int v1 = r.nextInt(n);
int  v2 = r.nextInt(n-1);
if (v2 >= v1)
  v2++

答案 1 :(得分:0)

评论的变体:

INDEX ON

评论提案是为for(int allrbA=0; allrbA<4; allrbA++) { int r = randoms1.nextInt(10 - 1); // range one less because one will be skipped if (r == load4G) r = 9; // don't want this one, take the one // that would have been included in the full range selectrb[allrbA].setText("" + r); } 添加一个随机值r,这意味着r >= load4G的最终值永远不会等于load4G - 具有相同的净效果

使用循环重新生成新的随机数:

r

如果 all 随机数必须不同,(Fisher-Yates)shuffle将是一个合适的解决方案。

答案 2 :(得分:0)

创建一个数组,然后检查数组中是否已存在新的随机数。虽然您只有4个循环的循环,但它不会影响性能,但在此解决方案中所有数字将是随机的。

    int arr[] = new int[4];

    for(int allrbA=0; allrbA<4; allrbA++) {

        int num;

        do{
             num = randoms1.nextInt(10);
        }
        while(!Arrays.asList(arr).contains(num));

        arr[allrbA] = num;

    }