Skip to content

Commit c22d80c

Browse files
committed
naive fisher yates shuffle
1 parent 568e25f commit c22d80c

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package problems.impl;
2+
3+
import problems.interfaces.FisherYatesShuffler;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Stack;
8+
9+
/**
10+
* Fisher-Yates Shuffle
11+
*
12+
* Write down the numbers from 1 through N.
13+
* Pick a random number k between one and the number of unstruck numbers remaining (inclusive).
14+
* Counting from the low end, strike out the kth number not yet struck out, and write it down at the end of a separate list.
15+
* Repeat from step 2 until all the numbers have been struck out.
16+
* The sequence of numbers written down in step 3 is now a random permutation of the original numbers.
17+
*
18+
* https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
19+
*/
20+
21+
public class FisherYatesShufflerImpl implements FisherYatesShuffler {
22+
@Override
23+
public <T> List<T> shuffle(final List<T> values) {
24+
final List<T> valuesToShuffle = new ArrayList<>(values);
25+
final List<T> shuffledValues = new Stack<>();
26+
while(valuesToShuffle.size() > 0) {
27+
int randomIndex = (int) (Math.random() * (valuesToShuffle.size() - 1));
28+
T value = valuesToShuffle.get(randomIndex);
29+
shuffledValues.add(value);
30+
valuesToShuffle.remove(randomIndex);
31+
}
32+
return shuffledValues;
33+
}
34+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package problems.interfaces;
2+
3+
import java.util.List;
4+
5+
public interface FisherYatesShuffler {
6+
<T> List<T> shuffle(final List<T> values);
7+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package problems.impl;
2+
3+
import org.junit.Test;
4+
import problems.interfaces.FisherYatesShuffler;
5+
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
10+
import static org.junit.Assert.*;
11+
12+
public class FisherYatesShufflerImplTest {
13+
14+
private final FisherYatesShuffler shuffler = new FisherYatesShufflerImpl();
15+
16+
@Test
17+
public void testShuffle() {
18+
final List<Integer> firstFiveNaturalNumbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
19+
final List<Integer> shuffledFirstFiveNaturalNumbers = shuffler.shuffle(firstFiveNaturalNumbers);
20+
assertEquals(firstFiveNaturalNumbers.size(), shuffledFirstFiveNaturalNumbers.size());
21+
assertTrue(shuffledFirstFiveNaturalNumbers.containsAll(firstFiveNaturalNumbers));
22+
}
23+
}

0 commit comments

Comments
 (0)