如何确保4个随机变量永远不相等?

时间:2017-04-20 18:22:15

标签: java android function math random

我有4个随机变量...

int img1 = (int) Math.round((Math.random() * images.length)-1);
int img2 = (int) Math.round((Math.random() * images.length)-1);
int img3 = (int) Math.round((Math.random() * images.length)-1);
int img4 = (int) Math.round((Math.random() * images.length)-1);

我需要确保他们永远不会相互平等,即使他们是随机的。我正在制作一个应用程序,其中有4个图像视图显示随机形状(保存在可绘制文件夹中)。下面是我的应用程序的图像,以便您更好地理解我的意思......

shapegame

底部的4个形状永远不会相同但是我需要它们在应用程序运行时随机显示。这是我目前的代码......

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    shape1 = (ImageView) findViewById(R.id.shape1);
    shape2 = (ImageView) findViewById(R.id.shape2);
    shape3 = (ImageView) findViewById(R.id.shape3);
    shape4 = (ImageView) findViewById(R.id.shape4);
    guessShape = (ImageView) findViewById(R.id.guessShape);
    shapes[0] = shape1;
    shapes[1] = shape2;
    shapes[2] = shape3;
    shapes[3] = shape4;

    //store all the shapes in an array
    int[] images = new int[] {R.drawable.img_0, R.drawable.img_1, R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,
    R.drawable.img_5, R.drawable.img_6, R.drawable.img_7, R.drawable.img_8, R.drawable.img_9, R.drawable.img_10,
            R.drawable.img_11, R.drawable.img_12, R.drawable.img_13, R.drawable.img_14, R.drawable.img_15, R.drawable.img_16,
            R.drawable.img_17};

    int[] outlines = new int[] {R.drawable.outline_0, R.drawable.outline_1, R.drawable.outline_2,
            R.drawable.outline_3, R.drawable.outline_4, R.drawable.outline_5, R.drawable.outline_6,
            R.drawable.outline_7, R.drawable.outline_8, R.drawable.outline_9, R.drawable.outline_10,
            R.drawable.outline_11, R.drawable.outline_12, R.drawable.outline_13, R.drawable.outline_14,
            R.drawable.outline_15, R.drawable.outline_16,R.drawable.outline_17};

    //generate random number between 0 and image.length

    int img1 = (int) Math.round((Math.random() * images.length)-1);
    int img2 = (int) Math.round((Math.random() * images.length)-1);
    int img3 = (int) Math.round((Math.random() * images.length)-1);
    int img4 = (int) Math.round((Math.random() * images.length)-1);
    System.out.println(img1);
    System.out.println(img2);
    System.out.println(img3);
    System.out.println(img4);


    int whichImg = (int) Math.round((Math.random() * 4));

    System.out.println(whichImg);

    if(whichImg == 1){
        whichImg = img1;
    } else if(whichImg == 2){
        whichImg = img2;
    } else if(whichImg == 3){
        whichImg = img3;
    } else {
        whichImg = img4;
    }

    int outlineID = outlines[whichImg];

    //conditions so that the 4 boxes don't have the same image
    if(img1 == img2 && img1 !=0 || img1 == img3 && img1 != 0 || img1 == img4 && img1 != 0){ //if img1 and another img is the same

        img1 = img1 - 1;
    }
    else if(img2 == img3 && img2 != 0 || img2 == img4 && img2 != 0){ //if img2 and another img is the same
        img2 = img2 - 1;
    }

    else if(img3 == img4 && img3 !=0){ //if img3 and another image is that same
        img3 = img3 - 1;
    }
    else if(img1==0 && img2==0 && img3 == 0 && img4 == 0){ //if all the images were 0
        img1 = img1 + 10;
        img2 = img2 + 5;
        img3 = img3 + 7;
        img4 = img4 + 14;
    }
    else if(img1==img2 && img2 == img3 && img1 !=0 && img1 != 17){ //if img1 and 2 others were the same
        img1 = img1 - 1;
        img3 = img3 + 1;
    }
    else if(img2==img3 && img3 == img4 && img2 != 0 && img2 != 17){ //if img2 and 2 others were the same
        img2 = img2 - 1;
        img4 = img4 + 1;
    }
    else if(img3 == img4 && img4 == img2 && img3 != 0 && img3 != 17){ //if img3 and 2 others were the same
        img3 = img3 - 1;
        img2 = img2 + 1;
    }
    else if(img1 == 17 && img2 == 17 && img3 == 17 && img4 == 17){
        img1 = img1 - 1;
        img2 = img2 - 2;
        img3 = img3 -3;
    }
    else {
        System.out.println("Finished comparing 4 variables");//this doesnt work..fix!
    }

    //set the image
    guessShape.setBackgroundResource(outlineID);
    shape1.setBackgroundResource(images[img1]);
    shape2.setBackgroundResource(images[img2]);
    shape3.setBackgroundResource(images[img3]);
    shape4.setBackgroundResource(images[img4]);

必须有一种更简单的方法来确保它们永远不会相互平等而不是如此多的if语句。请帮帮我!

3 个答案:

答案 0 :(得分:1)

如果图像总数很大,那么每次选择一个新图像时都要检查它是否已经在您的设置中。在不太可能的情况下,拒绝并重新选择。

如果图像总数不是很大,那么重复发生的可能性并不大。在这种情况下,从索引0到(n-1)中选择第一个。然后将您选择的那个交换到位置0.接下来,从索引1到(n-1)中选择第二个。然后将那一个交换到位置1.继续,直到你完成你的设置,在你的情况下将在0到3的位置。(这个算法被称为Fisher-Yates shuffle。)

答案 1 :(得分:0)

以下是两种可能性:

首先:创建一个包含所有random的列表,然后迭代它。

final List<Integer> collect = IntStream.range(0, args.length).boxed().collect(Collectors.toList());
Collections.shuffle(collect);

或者,只需获得4:

Set<Integer> randoms = new HashSet<>();
Random r = new Random();
while(randoms.size() < 4){ randoms.add(r.nextInt(args.length)); }

答案 2 :(得分:0)

如果我理解你的问题,你需要 ANY 四个不相同的随机数,你可以试试这个:

int max = 4; // the maximum number of the random numbers
Set<Integer> uniqueCollection = new HashSet<Integer>();
while(uniqueCollection.size()<max){
    uniqueCollection.add((int)(Math.random()*max*10)+1); // the 1 here for 0 values if any
}
for(Integer r : uniqueCollection){ // to test it
    System.out.println(r);
}