【发布时间】:2013-03-28 16:24:13
【问题描述】:
我有以下代码,它从一个列表中获取随机值并将它们放入一个多维数组中,我用它来创建一个 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实例将导致它们具有相同的种子,从而产生相同的随机数序列。 -
但是当我每次创建向量时都设置一个断点时,它具有不同的随机数序列。
-
Random的默认构造函数使用与时间相关的种子(请参阅the MSDN article)。当您在每次创建向量时中断时,对构造函数的调用在时间上间隔更远。因此它们具有不同的种子值并生成不同的随机序列。 -
@odyss-jii 你应该发布一个答案,因为你是第一个指出问题的人