Какова лучшая практика для получения случайного DateTime между двумя разами?

Если Ваши прямоугольники будут редкими (главным образом не пересекающийся) тогда, это могло бы быть достойное внимания при рекурсивной размерной кластеризации. Иначе дерево квадрантов, кажется, способ пойти (как был упомянут другими плакатами.

Это - типичная проблема в обнаружении коллизий в компьютерных играх, таким образом, нет никакой нехватки ресурсов, предлагающих способы решить его.

Здесь хорошее сообщение в блоге, суммирующее RCD.

Здесь статья Dr. Dobbs, суммирующая различные алгоритмы обнаружения коллизий, которые подошли бы.

17
задан abatishchev 30 September 2017 в 00:42
поделиться

5 ответов

Вы можете попробовать использовать:

TimeSpan timeSpan = endDate - startDate;
var randomTest = new Random();
TimeSpan newSpan = new TimeSpan(0, randomTest.Next(0, (int)timeSpan.TotalMinutes), 0);
DateTime newDate = startDate + newSpan;

Это даст вам разное время с точностью до минуты. Если вы хотите 100 (или больше 1) DateTime s, тогда только один раз создайте объект Random . На странице MSDN на Random подробно объясняется, почему создание нескольких Random объектов в быстрой последовательности - плохая идея.

Использование другого конструктора TimeSpan даст вам разную степень детализации. Из конструктора TimeSpan MSDN :

TimeSpan (Int64) Инициализирует новый TimeSpan указанным количеством тиков.
TimeSpan (Int32, Int32, Int32) Инициализирует новый TimeSpan на указанное количество часов, минут и секунд.
TimeSpan (Int32, Int32, Int32, Int32) Инициализирует новый TimeSpan на указанное количество дней, часов, минут и секунд.
TimeSpan (Int32, Int32, Int32, Int32, Int32) Инициализирует новый TimeSpan на указанное количество дней, часов, минут, секунд и миллисекунд.

37
ответ дан 30 November 2019 в 10:49
поделиться

Вот мой алгоритм и код:

  • найти разницу между двумя датами
  • для каждой итерации, создать случайное число между двумя датами
  • создать новую дату между ними . Просто добавьте это случайное число в качестве минут к дате начала и времени.

     Random randNum = new Random ();
    
    DateTime minDt = новый DateTime (2000,1,1,10,0,0);
    DateTime maxDt = новый DateTime (2000,1,1,17,0,0);
    Список  myDates = новый Список  ();
    //Random.Next в .NET не включает верхнюю границу (@NickLarsen)
    int minutesDiff = Convert.ToInt32 (maxDt.Subtract (minDt) .TotalMinutes + 1);
    
    для (int я = 0; я <100; я ++)
    {
     // какое-то случайное число не больше, чем minutesDiff, не меньше 1
     int r = randNum.Next (1, minutesDiff); 
     myDates.Add (minDt.AddMinutes (r));
    }
    
    foreach (DateTime d в myDates)
    {
     Console.WriteLine (string.Format ("{0: дд-МММ-гггг чч: мм}", д));
    }
    
4
ответ дан 30 November 2019 в 10:49
поделиться

Во-первых, выясните, какую точность вы хотите для случайного DateTime (часы, минуты, секунды, мс и т. Д.).

Затем выясните разницу между двумя датами в этой Блок.

Создайте случайное целое число между 0 и этой разницей.

Добавьте случайное целое число в единицах к исходной дате.

С учетом указанного выше варианта использования вычислите разницу вне цикла for.

Внутри цикла for получите случайное целое число и создайте случайную дату.

1
ответ дан 30 November 2019 в 10:49
поделиться

Вот метод, использующий случайное количество тактов:

Random r= new Random(); 
    //for better randomness don't recreate a new Random() too frequently.
long rand62bit = (((long)r.Next())<<31) + r.Next(); 
    // 62bits suffices for random datetimes, 31 does not!
DateTime newDate = startDate + new TimeSpan(rand62bit % (endDate - startDate).Ticks); 

Этот метод исключает последнюю дату и включает первую. Вы можете легко включить последнюю дату, добавив одну галочку к основному количеству (endDate - startDate) .Ticks .

0
ответ дан 30 November 2019 в 10:49
поделиться

Очень быстро:

  1. конвертируйте ваши даты в TotalHours
  2. Вычтите одно число из другого и используйте Abs для получения положительного
  3. Создайте случайное число в диапазоне от 1 и результат 2. выше
  4. Добавьте полученное случайное количество часов назад к более ранней из двух дат
2
ответ дан 30 November 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: