int numberArray[13];
constexpr int N {sizeof(numberArray) / sizeof(numberArray[0])};
long randomDealt;
void setup()
{
Serial.begin(115200);
pinMode(3, INPUT_PULLUP);
randomSeed(0xbadc0de);
}
void loop()
{
for (int ii = 0; ii < N; ii++)
numberArray[ii] = -1;
deal4();
Serial.println("");
for (int ii = 0; ii < N; ii++) {
Serial.print(numberArray[ii]);
Serial.print(" ");
}
Serial.println("");
Serial.println("");
delay(300);
while (digitalRead(3) == HIGH);
}
// Fisher Yates initialise and shuffle. oh, Knuth.
void deal2()
{
for (unsigned char tt = 0; tt < N; tt++) {
unsigned char card = random(0, tt);
if (card == tt) {
Serial.print(numberArray[card]);
Serial.print(" at ");
Serial.print(tt);
Serial.print(" is bad,");
Serial.print(" but "); Serial.print(tt);
Serial.print(" goes into array at ");
Serial.println(card);
}
numberArray[tt] = numberArray[card];
numberArray[card] = tt;
}
}
// Uniform Backward Inside-Out Fisher–Yates (safe)
void deal4()
{
for (int tt = N - 1; tt >= 0; --tt) {
const int card = random(tt, N); // Arduino: [tt, N)
if (card == tt) {
Serial.print(numberArray[card]);
Serial.print(" at ");
Serial.print(tt);
Serial.print(" is bad,");
Serial.print(" but "); Serial.print(tt);
Serial.print(" goes into array at ");
Serial.println(card);
}
numberArray[tt] = numberArray[card]; // displace existing value
numberArray[card] = tt; // insert new value
}
}