2014-12-13 79 views
0

我已经环视相当多,但似乎找不到满意的答案。我想用唯一的数字填写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(); 
    } 
+0

fisher/yates算法应该是完美的。假设你想要16 * 30之间的5 *独特*随机数。做'Enumerable.Range(16,15).ToArray()。Shuffle()。拿(5);' – dbc 2014-12-13 00:26:34

+0

很抱歉,我真的不知道这样做。如果我尝试在RandomNum类中放置它,那么在“shuffle”下面会显示“expected”。而枚举不适用于我认为的2D数组。 – halalbin 2014-12-13 00:57:20

回答

0
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; 
    } 
+0

谢谢你们!对此,我真的非常感激!但在这最后一篇文章中,我似乎无法理解.next()中的数学运算。我知道如何用“真正的”数学来计算它。但我不明白它在这里的工作原理以及数字的作用。你想给初学者解释一下吗? – halalbin 2014-12-14 02:30:13

+0

而且此代码不会在数组中生成唯一的数字。 – halalbin 2014-12-14 19:24:18

+0

你是怎么意思它不生成唯一的数字?你运行它了吗?它生成唯一的号码... – 2014-12-14 19:26:46

0

当我有需要,我使用的是这样的:

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; 
    } 
0

如果你有一个类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; 
     } 
    } 
}