3

i am using 9 image view's i want set images to imageview randomly , when I click on refresh button, but I tried like this it's working for random allocation of images but it's repeating the same image in two (or) three imageview's at a time. where is the problem in my code..

 final int[] imageViews = {
            R.id.imgview11, R.id.imgview12, R.id.imgview13, 
            R.id.imgview21, R.id.imgview22, R.id.imgview23, 
            R.id.imgview31, R.id.imgview32, R.id.imgview33 };

    final int[] images = {
            R.drawable.i1, R.drawable.i2, R.drawable.i3, 
            R.drawable.i4, R.drawable.i5, R.drawable.i6, 
            R.drawable.i7, R.drawable.i8, R.drawable.empty };

    final ImageButton shuffle = (ImageButton) findViewById(R.id.new_puzzle); 
    shuffle.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {        
            Random generator = new Random();
            //int n = 9;
            //n = generator.nextInt(n);
            //Random random = new Random(System.currentTimeMillis());
            for(int v : imageViews) {
                ImageView iv = (ImageView)findViewById(v);
                iv.setImageResource(images[generator.nextInt(images.length - 1)]);
            }
        }
    });      

i don't want repeat, one image for one imageview only..

Tushar Patil
  • 326
  • 4
  • 22
RajaReddy PolamReddy
  • 22,428
  • 19
  • 115
  • 166

3 Answers3

5

using the post of blessenm ,i wrote a similar code that you need. check if this helps you.

shuffle.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) { 

            Random rng = new Random(); 
            List<Integer> generated = new ArrayList<Integer>();
            for (int i = 0; i < 9; i++)
            {
              while(true)
              {
                 Integer next = rng.nextInt(9) ;
                 if (!generated.contains(next))
                 {
                    generated.add(next);
                    ImageView iv = (ImageView)findViewById(imageViews[i]);
                    iv.setImageResource(images[next]);
                    break;
                 }
               }
            }
            }
        });
Yashwanth Kumar
  • 28,931
  • 15
  • 65
  • 69
  • Please, this loop is not borned, you are looking for randoms numbers until you get all numbers from 1 to 9! It's like throwing a dice until you get all numbers from 1 to 6! Sometimes, you will need 6 tries, but most of the time, you will need 10, 15, or 20 tries! You will for sure waste the battery of the phone in useless computing! Please considering using my first solution and do not waste CPU on your app please, you are lucky that you need only 9 random numbers, imagine you need 1.000, your phone will simply die. – Waza_Be Sep 20 '11 at 04:57
  • 1
    Also, you forgot "generated.add(next);" in your loop! The code cannot work! Please consider reading this answer: http://stackoverflow.com/questions/4040001/java-creating-random-numbers-with-no-duplicates – Waza_Be Sep 20 '11 at 05:04
  • you are right +1, let me edit my answer. @raj add the missing line that profete suggested. – Yashwanth Kumar Sep 20 '11 at 07:52
  • How can you detect which drawables are being chosen/used? Is it possible to tag them or put ClipData into each specific drawable? – Kurty Aug 22 '12 at 18:40
1

Maybe not the perfect answer, but I would just shuffle the images list and the set the resulting image to the imageview.

This will avoid having to generate random numbers that will of course create duplicate (If you throw a dice 6 times, you won't have the numbers 1,2,3,4,5,6 in random order, you will get multiple time the same number.)

Please check everything including the 'i' as I am not in front of my computer.

List<int> list = Arrays.asList(images);
// Here we just simply used the shuffle method of Collections class
// to shuffle out defined array.
Collections.shuffle(list);

int i=0;
// Run the code again and again, then you'll see how simple we do shuffling
for (int picture: list) {
    ImageView iv = (ImageView)findViewById(imageViews[i]);
    iv.setImageResource(picture);
    i++;
}

as an alternative, you may also want to shuffle your list with this code:

public class ShuffleArray {
    public static void shuffleArray(int[] a) {
        int n = a.length;
        Random random = new Random();
        random.nextInt();
        for (int i = 0; i < n; i++) {
            int change = i + random.nextInt(n - i);
            swap(a, i, change);
        }
    }

    private static void swap(int[] a, int i, int change) {
        int helper = a[i];
        a[i] = a[change];
        a[change] = helper;
    }

    public static void main(String[] args) {
        int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7 };
        shuffleArray(a);
        for (int i : a) {
            System.out.println(i);
        }
    }
}
Waza_Be
  • 39,407
  • 49
  • 186
  • 260
0

You might want to refer to this post. It shows a method to generate random numbers without duplicates Creating random numbers with no duplicates

Community
  • 1
  • 1
blessanm86
  • 31,439
  • 14
  • 68
  • 79