2015-12-02 21 views
5

Sto cercando di scrivere un codice generare data casuale e l'ora in cui tutti i valori di (hh aaaa-mm-gg: mm: ss) vengono modificateCome arrivare sia a caso data e ora C#

ho usato questo codice, ma cambia solo la data e fissare il tempo

DateTime RandomDay() 
     { 
      DateTime start = new DateTime(2013, 1, 1 , 1 , 1 ,1); 
      Random gen = new Random(); 

      int range = (DateTime.Today - start).Days; 
      return start.AddDays(gen.Next(range)); 
     } 

ho detto ok se scrivo un codice che genera una data casuale, e conservarla in un variabile1, poi scrivere un altro codice che genera tempo casuale, e memorizzarlo in variabile2, quindi selezionare la data solo da variabile1 e selezionare l'ora solo da variabile2, quindi combinare variabile1 e variabile2 insieme, in modo da poter generare data e ora casuali Pertanto, ho scritto questo un altro metodo per generare il tempo

DateTime RandomTime() 
     { 
      DateTime start = new DateTime(2013, 1, 1, 1, 1, 1); 
      Random gen = new Random(); 

      int range = (DateTime.Today - start).Hours; 
      return start.AddHours(gen.Next(range)); 
     } 

ora il problema nel metodo randomtime, si generano ore casuali solo, non cambia i valori dei minuti e secondi,

c'è qualche suggerimento per risolvere il problema del codice? c'è comunque un modo per generare valori casuali per tutti (aaaa-mm-gg hh: mm: ss)?

+6

Basta aggiungere una quantità casuale di secondi entro i limiti legali di DateTime – stuartd

+2

Non li stai utilizzando in test di unità, giusto ..? – stuartd

+1

usa solo numeri casuali per tutti i parametri del costruttore – eschneider

risposta

6

Ecco un metodo che genererà in modo casuale ogni porzione di data e ora.

utilizza limiti appropriati in modo che la data generata è valida (anni entro 1-9999, mesi entro 1-12, una chiamata aDateTime.DaysInMonthin modo da non finire con 31 Febbraio, ecc).

public IEnumerable<DateTime> GenerateRandomDates(int numberOfDates) 
{ 
    var rnd = new Random(Guid.NewGuid().GetHashCode()); 

    for (int i = 0; i < numberOfDates; i++) 
    { 
     var year = rnd.Next(1, 10000); 
     var month = rnd.Next(1, 13); 
     var days = rnd.Next(1, DateTime.DaysInMonth(year, month) + 1); 

     yield return new DateTime(year, month, days, 
      rnd.Next(0, 24), rnd.Next(0, 60), rnd.Next(0, 60), rnd.Next(0, 1000)); 
    } 
} 

Per generare 10.000 di loro:

var randomDateTimes = GenerateRandomDates(10000); 
+0

Questo mi dà un valore strano "WebApplication1.AddToParkingDb + d__0" – amal50

+0

@ amal50 Come lo si utilizza? –

+0

protetto void Button1_Click (oggetto mittente, EventArgs e) { var randomDateTimes = GenerateRandomDates (10000); Response.Write (randomDateTimes);} – amal50

2

ecco la soluzione di una riga. 1 linea per la parte di ritorno;)

private static Random _ran = new Random(); 

public static DateTime RandomDateTime() 
{ 
    return 
     DateTime.MinValue.Add(
      TimeSpan.FromTicks((long) (_ran.NextDouble()*DateTime.MaxValue.Ticks))); 
} 

Nota 1: _ran.NextDouble() dà valore casuale tra 0 e 1. quindi la quantità di zecche si aggiunge a datetime minima sarebbe tra 0 e DateTime.MaxValue.Ticks. Quindi la data casuale dovrebbe essere tra il minimo e il massimo della data.

Nota 2: DateTime.Min.Ticks è uguale a 0. quindi questo processo non verrà mai superato anche se si aggiungono i tick di data massima.


Ecco come generare tempi di data casuale 10k.

DateTime[] datetimes = new DateTime[10000]; 

for (int i = 0; i < datetimes.Length; i++) 
{ 
    datetimes[i] = RandomDateTime(); 
} 

È inoltre possibile utilizzare questo metodo se si desidera definire gli intervalli.

public static DateTime RandomDateTime(DateTime min, DateTime max) 
{ 
    return 
     DateTime.MinValue.Add(
      TimeSpan.FromTicks(min.Ticks + (long) (_ran.NextDouble()*(max.Ticks - min.Ticks)))); 
}