2d 数组随机数(10 行,6 列)不重复到文件 C#

Posted

技术标签:

【中文标题】2d 数组随机数(10 行,6 列)不重复到文件 C#【英文标题】:2d_array random numbers (10Rows, 6 COLS) not repeated to file C# 【发布时间】:2021-08-01 16:03:43 【问题描述】:

我需要像彩票程序一样将 10 个随机数组合(不重复)流式写入 file.txt。我得到了除了非重复随机数之外的所有东西。它必须像具有 10 种组合的 2D 数组一样被视为(file.txt)。

class Matriz

    private int[,] array;
    private int nfilas, ncols;     

    public void Ingresar()
    
        Random aleatori = new Random();
        nfilas = 10;
        ncols = 6;
        Console.WriteLine("\n");
        array = new int[nfilas, ncols];
        for (int filas = 0; filas < nfilas; filas++)
        
            for (int columnas = 0; columnas < ncols; columnas++)
                array[filas, columnas] = aleatori.Next(0, 50);
        
    

    public void Imprimir()
    
        StreamWriter fitxer = new StreamWriter(@"C:\andres\lotto649.txt");
        int contador = 0;
        for (int f = 0; f < nfilas; f++)
        
            for (int c = 0; c < ncols; c++)                    
                fitxer.Write(array[f, c] + " ");

            fitxer.WriteLine();
            contador++;
        
        fitxer.WriteLine($"\n\n\tHay contador combinaciones de la Loteria 6/49");
        fitxer.Close();
    

    static void Main(string[] args)
                
        Matriz array_menu = new Matriz();
        array_menu.Ingresar();
        array_menu.Imprimir();           
       
    

【问题讨论】:

它实际上可以工作(编译,写出),但它会在同一行中生成重复的组合。如何解决? 我假设您只想避免每行重复。我认为最简单的解决方案是跟踪为该行写入的数字,如果已经包含下一个随机数,则继续生成新数字,直到您得到一个尚未在列表中的数字。 基本思路是:列出你的 50 个号码,然后随机取一个号码并从列表中删除该号码,然后获取下一个号码,直到列表为空或你有足够的号码。 @jack-t-spades 是的,它只是为了避免每行重复,您建议使用 if (nums.Contains (aleatori)) 条件?像这样? 不相关:我建议创建一个静态 Random 对象作为类字段而不是本地对象。 【参考方案1】:

这样的事情应该可以工作。 在给定位置插入新数字之前,请检查到目前为止的行中是否已经存在相同的数字,如果存在,请重复该过程,直到获得一个尚未存在的数字。

for (int filas = 0; filas < nfilas; filas++)

  for (int columnas = 0; columnas < ncols; columnas++)
  
    bool cont = true;
    while(cont)
    
      cont = false;
      int newRand = aleatori.Next(0, 50);
      for(int i = 0; i < columnas; i++)
        if(array[filas, i] == newRand)
          cont = true;
      if(cont)
        continue;
      array[filas, columnas] = newRand;
      break;
    
  

或者,由于数字很小,您也可以使用整数列表并从那里删除给定的值。

这样做的好处是,您永远不必重做随机数,因为它总是会产生有效的结果。上面的例子可以(理论上)无限期地运行。

for (int filas = 0; filas < nfilas; filas++)

  List<int> nums = new List<int>(49);
  for(int i = 0; i < 49; i++)
    nums.Add(i + 1); //num 1...49

  for (int columnas = 0; columnas < ncols; columnas++)
  
    int index = aleatori.Next(0, nums.Count)
    array[filas, columnas] = nums[index];
    nums.RemoveAt(index);
  

【讨论】:

以上是关于2d 数组随机数(10 行,6 列)不重复到文件 C#的主要内容,如果未能解决你的问题,请参考以下文章

VBS产生随机不重复的数字

用js实现随机选取10–100之间的10个且不重复的数字,存入一个数组。

固定值不在列和行上重复

随机生成一组不重复的随机数组

用java随机生成一个6行5列的二维数组

笔试题大集合