如何在不同的行/列中使用唯一的随机数填充数组

本文关键字:唯一 随机数 数组 填充 | 更新日期: 2023-09-27 18:34:14

我现在环顾四周,但似乎找不到令人满意的答案。我想用唯一的数字填充 5x5。在第 1 列中,它只能是 1-5 之间的数字,在第 2 列中只能是 16-30 之间的数字,依此类推,直到第 5 列的数字介于 61-75 之间。它是一个宾果游戏板。我已经尝试了几件事,但没有一种有效,我似乎找不到用我的规格填充数组的方法。我到处看,它都只是带有几个数字的预填充数组的示例,或者代码对我来说是高级的方式。

不久前,我创建了一个程序,该程序创建了一个数字为1-75的常规数组,然后使用fisher/yates算法对其进行洗牌。这是我应该继续使用的东西还是应该从头开始?enter code here

 static void Main(string[] args)
{
    string choise = "";
    while (choise != "q" && choise != "Q")
    {
        Console.Clear();
        Console.WriteLine("[1] for a random row of numbers! 'n[2] to start the game! 
        'n[Q] to quit! 'nPress enter after your selection.");
        choise = Console.ReadLine();
        if (choise == "1")
        {
            RandomNum.randomTal();
        }
  (another class)
  static  Random rnd = new Random();
   public static void Shuffle<T>(T[] array)
    {
        Console.Clear();
        for (int i = 0; i < array.Length; i++)
        {
            int r = i + (int)(rnd.NextDouble() * (array.Length - i));
            T t = array[r];
            array[r] = array[i];
            array[i] = t;
        }
    }
(and another class)
class RandomNum
  {
    public static void randomTal()
    {
        int[] sifferArray = Enumerable.Range(1, 56).ToArray();
        shuffle.Shuffle(sifferArray);
        foreach (var item in sifferArray)
        {
            Console.WriteLine(item);
        }
        Console.WriteLine("Press any key to go back.");
        Console.ReadKey();
    }

如何在不同的行/列中使用唯一的随机数填充数组

static void Main(string[] args)
    {
        var bingoCard = getBingoCard();
        int colNum = 1;
        foreach (var col in bingoCard)
        {
            Console.Write("col" + colNum.ToString() + " ");
            foreach (var item in col)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
            colNum++;
        }
        Console.WriteLine();
        for (int x = 0; x < 5; x++)
        {
            for (int y = 0; y < 5; y++)
            {
                Console.Write(bingoCard[y][x].ToString() + (bingoCard[y][x] > 9 ?  " " : "  "));
            }
            Console.WriteLine();
        }
        Console.ReadLine();
    }

    public static int[][] getBingoCard()
    {
        var randGen = new Random();
        var bingoCard = new int[][]{
        new int[5],
        new int[5],
        new int[5],
        new int[5],
        new int[5]
    };
        for (int y = 0; y < 5; y++)
        {
            for (int x = 0; x < 5; x++)
            {
                var possibleNumber = randGen.Next((15 * y) + 1, ((y + 1) * 15));
                while (bingoCard[y].Any(num => num == possibleNumber))
                {
                    possibleNumber = randGen.Next((15 * y) + 1, ((y + 1) * 15));
                }
                bingoCard[y][x] = possibleNumber;
            }
        }
        return bingoCard;
    }

当我有需要时,我会使用这样的东西:

   private int[] generatePermutation(int size, int seed) 
   {
        var permutation = new int[size];
        Rnd random = new Rnd(seed);
        List<int> permList = new List<int>(size);
        for (int i = 0; i < size; i++) permList.Add(i);
        for (int i = 0; i < size; i++)
        {
            int index = random.Next(0, permList.Count);
            permutation[i] = permList[index];
            permList.RemoveAt(index);
        }
        return permutation;
    }

如果你有一个类BingoBoard,其中包含一个与单元格对应的嵌入式二维整数数组,你可以像这样生成单元格的随机模式:

public class BingoBoard
{
    public const int BoardDimension = 5;
    readonly int[,] board = new int[BoardDimension, BoardDimension];
    public BingoBoard()
    {
        // In column 1 it can only be a number between 1-15 and in column 2 number 16-30 and so on up until column 5 with a number between 61-75.
        for (int iRow = 0; iRow < board.GetLength(0); iRow++)
        {
            var col = Enumerable.Range(iRow * 3 * board.GetLength(1) + 1, 3 * board.GetLength(1)).Shuffle().Take(board.GetLength(1)).ToArray();
            for (int iCol = 0; iCol < board.GetLength(1); iCol++)
                board[iRow, iCol] = col[iCol];
        }
    }
    public int[,] Board
    {
        get
        {
            return board;
        }
    }
}
public static class RandomProvider
{
    // Adapted from http://csharpindepth.com/Articles/Chapter12/Random.aspx
    private static int seed = Environment.TickCount;
    [ThreadStatic]
    static Random random;
    public static Random GetThreadRandom()
    {
        if (random == null)
            random = new Random(Interlocked.Increment(ref seed));
        return random;
    }
}
public class FisherYatesShuffle 
{
    public void ShuffleInPlace<T>(T[] array)
    {
        var randomizer = RandomProvider.GetThreadRandom();
        // http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm , second version.
        for (int i = 0; i < array.Length; i++)
        {
            // http://msdn.microsoft.com/en-us/library/2dx6wyd4%28v=vs.110%29.aspx
            var j = randomizer.Next(i, array.Length); // i = inclusive lower bound; array.Length = The exclusive upper bound of the random number returned
            array.Swap(i, j);
        }
    }
}
public static class ListExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> list)
    {
        var scrambled = list.ToArray();
        new FisherYatesShuffle().ShuffleInPlace(scrambled);
        return scrambled;
    }
    public static void Swap<T>(this T[] list, int i, int j)
    {
        if (list == null)
            throw new ArgumentNullException();
        if (i != j)
        {
            T temp = list[i];
            list[i] = list[j];
            list[j] = temp;
        }
    }
}