const byte N = 10; // number of cards
int numberArray[N];
long randomDealt;
void setup()
{
Serial.begin(115200);
Serial.print("reset ");
Serial.println(N);
pinMode(2, INPUT_PULLUP);
}
void loop()
{
for (int ii = 0; ii < 13; ii++) numberArray[ii] = -1; // sentinel
// deal4s();
deal2Fi();
if (0) for (int element : numberArray)
Serial.print(element),Serial.print(" ");
Serial.println("");
Serial.println("");
delay(777);
while (digitalRead(2) == HIGH);
}
// Uniform Backward Inside-Out Fisher–Yates (safe)
void deal4s()
{
for (int tt = N - 1; tt >= 0; --tt) {
const int card = random(tt, N); // Arduino: [tt, N)
if (card != tt) {
numberArray[tt] = numberArray[card]; // displace existing value
}
else {
Serial.print("tt = card "); Serial.println(tt);;
}
numberArray[card] = tt; // insert new value
printArray(tt, card);
}
}
// Uniform Backward inside-out Fisher–Yates
void deal4()
{
for (int tt = N - 1; tt >= 0; --tt) {
const int card = random(tt, N);
numberArray[tt] = numberArray[card];
numberArray[card] = tt;
// if (1) printArray(tt, card);
}
}
// Fisher Yates initialise and shuffle. oh, Knuth.
// this is "inside-out"
void deal2F()
{
for (unsigned char tt = 0; tt < N; tt++) {
unsigned char card = random(0, tt + 1);
numberArray[tt] = numberArray[card];
numberArray[card] = tt;
// printArrayF(tt, card);
}
}
char buffer[80];
void deal2Fi()
{
for (unsigned char tt = 0; tt < N; tt++) {
unsigned char card = random(0, tt + 1); // upper was tt + 1
snprintf(buffer, 79, "%2d: array[%2d] (%2d) -> array[%2d] and %2d -> array[%2d]\n",
tt, card, numberArray[card], tt, tt, card);
Serial.print(buffer);
numberArray[tt] = numberArray[card];
numberArray[card] = tt;
}
Serial.println("");
printArrayP();
}
void printArrayP()
{
for (int i = 0; i < N; i++) {
Serial.print(numberArray[i]); Serial.print(" ");
}
Serial.println();
}
// for the backward order, shows the result building right to left
// to do. make this go from left OR right
// just use snprintf to format the lines, this breaks at N >= 11
void printArray(int slot, int card)
{
Serial.print(slot); Serial.print(" : ");
Serial.print(card); Serial.print(". ");
for (int i = 0; i < N; i++) {
if (i < slot) Serial.print("_ ");
else {
// numbers:
//Serial.print(numberArray[i]);
//Serial.print(' ');
// or letters for <=26:
Serial.print((char)('A' + numberArray[i])); Serial.print(' ');
}
}
Serial.println();
}
// for the forward order?
void printArrayF(int slot, int card)
{
Serial.print(slot); Serial.print(" : ");
Serial.print(card); Serial.print(". ");
for (unsigned char tt = 0; tt < N; tt++) {
Serial.print(numberArray[tt]); Serial.print(" ");
}
Serial.println("");
}