using System.Collections.Generic;
public static void Main()
var card = BingoGenerator.CreateCard();
private static void PrintCard(int?[][,] card)
foreach(var table in card)
for(var i=0;i<table.GetLength(0);i++)
for(var j=0;j<table.GetLength(1);j++)
Console.Write("[{0,2}]", table[i,j].HasValue ? table[i,j].ToString() : "");
static class BingoGenerator {
private const int rowsPerTable = 3;
private const int tablesPerCard = 3;
private const int numberOfRows = tablesPerCard * rowsPerTable;
private const int blanksPerRow = 4;
private const int numbersPerRow = 5;
private const int numberOfColumns = blanksPerRow + numbersPerRow;
private static bool[] _rowTemplate = Enumerable
.Concat(Enumerable.Range(0, numbersPerRow).Select(_ => true))
private static Random _rnd = new();
public static int?[][,] CreateCard()
var columns = CreateColumns().ToArray();
return CreateTables(columns, rows);
private static int?[][,] CreateTables(int[][] columns, IEnumerable<bool[]> rows)
var tables = new int?[tablesPerCard][,];
for(var i=0;i<tablesPerCard;i++)
tables[i] = CreateTable(i, columns, rows.Skip(i * tablesPerCard).Take(rowsPerTable));
private static int?[,] CreateTable(int tableNumber, int[][] columns, IEnumerable<bool[]> rows)
var table = new int?[rowsPerTable, numberOfColumns];
for(var i=0;i<numberOfColumns;i++)
table[j,i] = row[i] ? columns[i][j + (tableNumber * rowsPerTable)] : null;
private static IEnumerable<bool[]> CreateRows()
.Select(_ => _rowTemplate.OrderBy(r => _rnd.Next()).ToArray());
private static IEnumerable<int[]> CreateColumns()
.Range(0, numberOfColumns)
private static int[] CreateColumn(int columnIndex)
.Range(1 + (10 * columnIndex), numberOfRows)
.OrderBy(r => _rnd.Next())