Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

Randomise An Array of integers

Posted on 2002-03-11
Medium Priority
221 Views
Hi, My problem is that, first of all I have an array that contains integer values. Now, what I want is to shuffle the contents in a random manner.

I tried using the random class and failed by far cause it appears that it allows a certain range that it can select from. I dont need to select any range. I just want to randomise the values that I already have in the array. Hope it is clear and understandable.

Thanx...!!
0
Question by:q_bic
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 2
• 2
• 2
• +3

LVL 9

Accepted Solution

Venci75 earned 300 total points
ID: 6855726
then - try this:
for (int i = 0; i < arr.length; i++) {
j = (new java.util.Random()).nextInt(); // random position
int buff = arr[i];
arr[i] = arr[j];
arr[j] = buff;
}
0

LVL 28

Expert Comment

ID: 6855744

import java.io.*;
import java.util.*;
public class Tryrandom
{
public static void main(String args[])
{
Object numbers[] = {"0","1","2","3","4","5","6","7"};
ArrayList as = new ArrayList(Arrays.asList(numbers));
Collections.shuffle(as);
numbers = as.toArray();
for (int i=0;i<8;i++)
System.out.println("result["+i+"]= "+ numbers[i]);
}
}
0

LVL 18

Expert Comment

ID: 6855745
something like this would work:

Vector v1 = new Vector();

for (int i=0;i<100;i++) {
}

Collections.shuffle(v1);

for (int i=0;i<100;i++) {
out.println(v1.elementAt(i));
}

0

LVL 18

Expert Comment

ID: 6855746
damn, too slow ;(
0

LVL 7

Expert Comment

ID: 6855753
Hi,

> j = (new java.util.Random()).nextInt();
There is no need to create new Random instance each time. And don't let index to go out of range:

Before loop: Random random = new java.util.Random();

Inside loop: j = random.nextInt() % arr.length;

Igor
0

LVL 6

Expert Comment

ID: 6855968
Heres an option. This is pseudo code:

java.util.Random r = new java.util.Random();
Object numbers[] = {"0","1","2","3","4","5","6","7"};
for( int cnt = 0; cnt < number.length; cnt++ ) {
int index = (int)((numbers.length - cnt - 1)* r.nextDouble() + 0.5);
// do the swap
int tmp = numbers[cnt];
numbers[cnt] = numbers[cnt+1+index];
numbers[cnt+1+index] = tmp;
}

This promis you the following things:
1. Time complexity of o(n).
2. Space complexity of o(n).
3. You will touch each cell of the array at least once.
0

LVL 9

Expert Comment

ID: 6856005
bazarny -> yes - you are right - I forgot this:
j = random.nextInt() % arr.length;
but regarding the new Random() - I used it only for demonstration.

rrz - great suggestion!
0

Author Comment

ID: 6859999
thanx for the great Idea.
0

LVL 6

Expert Comment

ID: 6863845
I am sorry to say that after you had accepted the answer, however, the solution by Venci75 is wrong in my opinion.

This:
j = random.nextInt() % arr.length;

is not so good since you may touch any cell, also the ones that you already shuffled. The probability that you will undo shuffles is not zero. This is why in my solution I used:

int index = (int)((numbers.length - cnt - 1)* r.nextDouble() + 0.5);

And the range is getting smaller each time - to the ones that were not touched yet.
0

Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing instaâ€¦
This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correctâ€¦
This tutorial will introduce the viewer to VisualVM for the Java platform application. This video explains an example program and covers the Overview, Monitor, and Heap Dump tabs.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
Suggested Courses
Course of the Month8 days, 2 hours left to enroll