Estoy buscando un código breve y moderno de C # para generar una fecha aleatoria entre el 1 de enero de 1995 y la fecha actual.
Estoy pensando en alguna solución que utilice Enumerable. El rango de alguna manera puede hacer que esto sea más conciso.
Estoy buscando un código breve y moderno de C # para generar una fecha aleatoria entre el 1 de enero de 1995 y la fecha actual.
Estoy pensando en alguna solución que utilice Enumerable. El rango de alguna manera puede hacer que esto sea más conciso.
Respuestas:
private Random gen = new Random();
DateTime RandomDay()
{
DateTime start = new DateTime(1995, 1, 1);
int range = (DateTime.Today - start).Days;
return start.AddDays(gen.Next(range));
}
Para un mejor rendimiento si esto se llama repetidamente, cree las variables starty gen(y tal vez incluso range) fuera de la función.
Esto es una ligera respuesta al comentario de Joel sobre hacer una versión ligeramente más optimizada. En lugar de devolver una fecha aleatoria directamente, ¿por qué no devolver una función generadora a la que se pueda llamar repetidamente para crear una fecha aleatoria?
Func<DateTime> RandomDayFunc()
{
DateTime start = new DateTime(1995, 1, 1);
Random gen = new Random();
int range = ((TimeSpan)(DateTime.Today - start)).Days;
return () => start.AddDays(gen.Next(range));
}
for (int i = 0; i < 100; i++) { array[i].DateProp = RandomDayFunc()(); }
var getRandomDate = RandomDayFunc();luego la llamas para obtener fechas aleatorias: var randomDate = getRandomDate();recuerda que debes reutilizar getRandomDate para que esto sea más útil que la respuesta de Joel.
Tomé la respuesta de @Joel Coehoorn e hice los cambios que aconsejó: eliminar la variable del método y poner todo en clase. Además, ahora el tiempo también es aleatorio. Aquí está el resultado.
class RandomDateTime
{
DateTime start;
Random gen;
int range;
public RandomDateTime()
{
start = new DateTime(1995, 1, 1);
gen = new Random();
range = (DateTime.Today - start).Days;
}
public DateTime Next()
{
return start.AddDays(gen.Next(range)).AddHours(gen.Next(0,24)).AddMinutes(gen.Next(0,60)).AddSeconds(gen.Next(0,60));
}
}
Y un ejemplo de cómo usar para escribir 100 DateTimes al azar en la consola:
RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(date.Next());
}
range = (int)(DateTime.Today - start).TotalSeconds;y return start.AddSeconds(gen.Next(range));.
Bueno, si va a presentar una optimización alternativa, también podemos buscar un iterador:
static IEnumerable<DateTime> RandomDay()
{
DateTime start = new DateTime(1995, 1, 1);
Random gen = new Random();
int range = ((TimeSpan)(DateTime.Today - start)).Days;
while (true)
yield return start.AddDays(gen.Next(range));
}
podrías usarlo así:
int i=0;
foreach(DateTime dt in RandomDay())
{
Console.WriteLine(dt);
if (++i == 10)
break;
}
Comience con un objeto de fecha fija (1 de enero de 1995) y agregue un número aleatorio de días con AddDays (obviamente, preste atención sin superar la fecha actual).
Llego un poco tarde al juego, pero aquí hay una solución que funciona bien:
void Main()
{
var dateResult = GetRandomDates(new DateTime(1995, 1, 1), DateTime.UtcNow, 100);
foreach (var r in dateResult)
Console.WriteLine(r);
}
public static IList<DateTime> GetRandomDates(DateTime startDate, DateTime maxDate, int range)
{
var randomResult = GetRandomNumbers(range).ToArray();
var calculationValue = maxDate.Subtract(startDate).TotalMinutes / int.MaxValue;
var dateResults = randomResult.Select(s => startDate.AddMinutes(s * calculationValue)).ToList();
return dateResults;
}
public static IEnumerable<int> GetRandomNumbers(int size)
{
var data = new byte[4];
using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider(data))
{
for (int i = 0; i < size; i++)
{
rng.GetBytes(data);
var value = BitConverter.ToInt32(data, 0);
yield return value < 0 ? value * -1 : value;
}
}
}
Pequeño método que devuelve una fecha aleatoria como cadena, basada en algunos parámetros de entrada simples. Construido en base a las variaciones de las respuestas anteriores:
public string RandomDate(int startYear = 1960, string outputDateFormat = "yyyy-MM-dd")
{
DateTime start = new DateTime(startYear, 1, 1);
Random gen = new Random(Guid.NewGuid().GetHashCode());
int range = (DateTime.Today - start).Days;
return start.AddDays(gen.Next(range)).ToString(outputDateFormat);
}