Ponder These
- How good does a card shark have to be at cutting and riffle shuffling to have an advantage at cards?
- How many distinct permutations are possible when n cards are perfectly riffle shuffled repeatedly?
Java Program
public class CardShark
{
public static void main(String[] args)
{
List list = new List();
for (int i = 0; i < 10000; i++)
{
args = RiffleShuffler.shuffle(args);
list.update(args);
}
for (Node i = list.head; i != null; i = i.next)
{
System.out.println(i.value + ": " + i.tally);
}
}
}
class RiffleShuffler
{
public static double cutSkill = 1;
public static double riffleSkill = 1;
private static int cut(int n)
{
int m = n / 2;
while (m > 0 && Math.random() > cutSkill)
m--;
while (m < n && Math.random() > cutSkill)
m++;
return m;
}
public static String[] shuffle(String[] a)
{
int n = a.length;
int m = cut(n);
String[] shuffled = new String[n];
int i = 0, j = m, k = 0;
while (i < m || j < n)
{
if (i < m && (Math.random() < riffleSkill || j == n))
{
shuffled[k++] = a[i++];
}
if (j < n && (Math.random() < riffleSkill || i == m))
{
shuffled[k++] = a[j++];
}
}
return shuffled;
}
}
class KnuthShuffler
{
public static String[] shuffle(String[] a)
{
int last = a.length - 1;
for (int i = 0; i < last; i++)
{
int r = Util.random(i, last);
Util.swap(a, i, r);
}
return a;
}
}
class Util
{
public static int random(int i, int j)
{
if (j < i)
{
return random(j, i);
}
double r = Math.random(); // 0 <= r < 1
r *= (1 + j - i); // stretch r
r += i; // shift r
return (int) r; // drop fractional part
}
public static void swap(String[] a, int i, int j)
{
String tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
class List
{
Node head = null;
public void update(String[] a)
{
String s = "";
for (String each : a)
{
s += each;
}
for (Node i = head; i != null; i = i.next)
{
if (s.equals(i.value))
{
i.tally++;
return;
}
}
head = new Node(s, head);
}
}
class Node
{
Node next;
String value;
int tally = 1;
public Node(String s, Node n)
{
value = s;
next = n;
}
}
See Also