Если Ваши прямоугольники будут редкими (главным образом не пересекающийся) тогда, это могло бы быть достойное внимания при рекурсивной размерной кластеризации. Иначе дерево квадрантов, кажется, способ пойти (как был упомянут другими плакатами.
Это - типичная проблема в обнаружении коллизий в компьютерных играх, таким образом, нет никакой нехватки ресурсов, предлагающих способы решить его.
Здесь хорошее сообщение в блоге, суммирующее RCD.
Здесь статья Dr. Dobbs, суммирующая различные алгоритмы обнаружения коллизий, которые подошли бы.
Вы можете попробовать использовать:
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 на указанное количество дней, часов, минут, секунд и миллисекунд.
Вот мой алгоритм и код:
создать новую дату между ними . Просто добавьте это случайное число в качестве минут к дате начала и времени.
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: дд-МММ-гггг чч: мм}", д));
}
Во-первых, выясните, какую точность вы хотите для случайного DateTime (часы, минуты, секунды, мс и т. Д.).
Затем выясните разницу между двумя датами в этой Блок.
Создайте случайное целое число между 0 и этой разницей.
Добавьте случайное целое число в единицах к исходной дате.
С учетом указанного выше варианта использования вычислите разницу вне цикла for.
Внутри цикла for получите случайное целое число и создайте случайную дату.
Вот метод, использующий случайное количество тактов:
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
.
Очень быстро: