The problem is in the following 2 line -
column = orderCols[k][j];
row = orderRows[orderCols[k]];
The whole thing could be made easier to read with -
// pertinent declarations
#include <LiquidCrystal.h>
#define k_COL 16
#define k_ROW 2
char LCDarray[k_ROW][k_COL];
inline void int_swap(int& lhs, int& rhs) {
int _lhs = lhs; lhs = rhs; rhs = _lhs;
}
int randomWriteArray2(char array[][k_COL])
{
int orderCols[k_ROW][k_COL];
int orderRows[k_ROW];
// randomSeed(time);
// fill orderCols with "0 to k_COL-1" for all k_ROW
for ( int j = k_ROW; j--; )
{
for ( int k = k_COL; k--; )
{
orderCols[j][k] = k;
}
}
// randomize orderCols
for ( int j = k_ROW; j--; )
{
for ( int k = k_COL; k--; )
{
int_swap(orderCols[j][k], orderCols[j][random(k_COL)]);
}
}
// fill orderRows with "0 to k_ROW-1"
for ( int k = k_ROW; k--; )
{
orderRows[k] = k;
}
// randomize elements
for ( int k = k_COL; k--; )
{
int_swap(orderRows[k], orderRows[random(k_ROW)]);
}
// print by randomizing order rows each time and printing all cells in order
int column, row; // extra variables for temporary readability
for ( int j = 0; j < k_COL; j++ )
{
for ( int k = 0; k < k_ROW; k++ )
{
column = orderCols[k][j];
row = orderRows[orderCols[k]];
lcd.setCursor(column, row);
lcd.write(array[row][column]);
delay(100);
}
// randomize row pick again
for ( int k = k_ROW; k--; )
{
orderRows[k] = k;
}
for ( int k = k_COL; k--; )
{
int_swap(orderRows[k], orderRows[random(k_ROW)]);
}
}
// wipeArray(array);
return 0;
}