多维数组是重复的向量

本文关键字:向量 数组 | 更新日期: 2023-09-27 18:06:25

我有以下代码,从一个列表中获取随机值,并将它们放入一个多维数组中,我用它来创建一个PDF:

protected void ConstruirExamenesAndGenerarPdf(int[] idUnidades, int numeroExamenes, int numeroReactivos)
{
    var modeloReactivos   = new ModeloReactivos();
    var reactivosUnidades = modeloReactivos.ObtenerReactivosPorIdsUnidades(idUnidades);
    var examenes = ConstruirExamenes(reactivosUnidades, numeroExamenes, numeroReactivos);
    GenerarPdf(examenes, reactivosUnidades);
}

private int[][] ConstruirExamenes(List<Reactivo> reactivosUnidades, int numeroExamenes, int numeroReactivos)
{
    var cantidadObligatorios   = reactivosUnidades.Where(r => r.obligatorio == (byte)Reactivo.Obligatoria.Si).Count();
    var cantidadNoObligatorios = reactivosUnidades.Where(r => r.obligatorio == (byte)Reactivo.Obligatoria.No).Count();
    var indicesObligatorios   = Enumerable.Range(0, cantidadObligatorios - 1).ToArray();
    var indicesNoObligatorios = Enumerable.Range(indicesObligatorios.Length, cantidadNoObligatorios - 1).ToArray();
    var examenes = new int[numeroExamenes][];
    for (var indiceExamen = 0; indiceExamen < numeroExamenes; indiceExamen++)
    {
        examenes[indiceExamen] = ConstruirExamen(indicesObligatorios, indicesNoObligatorios, numeroReactivos);
    }
    return examenes;
}
protected int[] ConstruirExamen(int[] indicesObligatorios, int[] indicesNoObligatorios, int numeroReactivos)
{
    var examen = new List<int>();
    AgregarReactivosAleatorios(examen, indicesObligatorios, numeroReactivos);
    AgregarReactivosAleatorios(examen, indicesNoObligatorios, numeroReactivos);
    return examen.ToArray();
}
private static void AgregarReactivosAleatorios(List<int> examen, int[] indicesReactivos, int numeroReactivos)
{
    var random = new Random();
    var actual = indicesReactivos.Length;
    for (var i = examen.Count; i < numeroReactivos && i < indicesReactivos.Length; i++)
    {
        var indexReactivoSeleccionar = random.Next(actual);
        var agregarEn = random.Next(0, examen.Count + 1);
        examen.Insert(agregarEn, indicesReactivos[indexReactivoSeleccionar]);
        indicesReactivos[indexReactivoSeleccionar] = indicesReactivos[--actual];
        indicesReactivos[actual]                   = examen[agregarEn];
    }
}

在调试时,如果我在生成pdf和检查数组之前设置一个断点,它看起来像这样:

[ [1,15,42,58],
  [8,9,52,69],
  [1,15,42,58],
  [8,9,52,69] ]

注意,第1行和第3行是相等的,第2行和第4行也是相等的。如果我在每次创建向量时都设置断点,则值似乎不会重复。是什么导致了这种情况?

多维数组是重复的向量

如果该方法被多次调用,那么您不应该在该方法中创建Random实例。使用单个Random实例。原因是使用默认构造函数快速连续创建Random的几个实例将导致它们具有相同的种子,从而产生相同的随机数序列。