static HexagonBoard() { randomNumbers = new Dictionary <Player, long[, ]>(); neighborLookup = new HexCoordinate[BOARD_WIDTH, BOARD_WIDTH][]; var blackRandomNumbers = new long[BOARD_WIDTH, BOARD_WIDTH]; var whiteRandomNumbers = new long[BOARD_WIDTH, BOARD_WIDTH]; var random = new Random(1); // always use the same seed for deterministic results var byteBuffer = new byte[64]; for (var r = -BOARD_RADIUS; r <= BOARD_RADIUS; r++) { var q_start = Math.Max(-BOARD_RADIUS - r, -BOARD_RADIUS); var q_end = Math.Min(BOARD_RADIUS - r, BOARD_RADIUS); for (var q = q_start; q <= q_end; q++) { // Generate random numbers for zobris hashing var arrayPos = new HexCoordinate(r + BOARD_RADIUS, q + BOARD_RADIUS); random.NextBytes(byteBuffer); blackRandomNumbers[arrayPos.R, arrayPos.Q] = Math.Abs(BitConverter.ToInt64(byteBuffer, 0)); random.NextBytes(byteBuffer); whiteRandomNumbers[arrayPos.R, arrayPos.Q] = Math.Abs(BitConverter.ToInt64(byteBuffer, 0)); // Generate valid neighbors for faster access var pos = new HexCoordinate(r, q); neighborLookup[arrayPos.R, arrayPos.Q] = pos.GetNeighborsClockwise().Where(x => x.Distance(new HexCoordinate(0, 0)) <= BOARD_RADIUS).ToArray(); } } randomNumbers.Add(Player.Black, blackRandomNumbers); randomNumbers.Add(Player.White, whiteRandomNumbers); }