2013-03-28 4 views
0

je le code suivant qui prend des valeurs aléatoires d'une liste et les met dans un tableau multidimensionnel, que je l'utilise pour créer un PDF:tableau Multidimensional répète vecteurs

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

Bien que le débogage, si Je mets un point d'arrêt avant droit générer le pdf et inspectez le tableau, il ressemble à ceci:

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

Notez que les lignes 1 et 3 sont égaux, tout comme 2 et 4. Si je mets à la place du point d'arrêt à chaque fois qu'un vecteur est créé, les valeurs ne semblent pas se répéter. Qu'est-ce qui cause ça?

+0

Comment cette méthode est-elle appelée? –

+2

Si la méthode est appelée plusieurs fois, vous ne devez pas créer l'instance 'Random' dans la méthode. Utilisez une seule instance 'Random'. La raison en est que créer plusieurs instances de 'Random' en succession rapide en utilisant le constructeur par défaut leur permettra d'avoir la même graine et de produire ainsi la même séquence de nombres aléatoires. –

+0

Mais quand je mets un point d'arrêt à chaque fois qu'un vecteur est créé, il a une séquence différente de nombres aléatoires. – DiegooMed

Répondre

1

Si la méthode est appelée plusieurs fois, vous ne devez pas créer l'instance Random dans la méthode. Utilisez une seule instance Random. La raison en est que créer plusieurs instances de Random en succession rapide en utilisant le constructeur par défaut leur permettra d'avoir la même graine et de produire ainsi la même séquence de nombres aléatoires.