Tôi đang tìm kiếm một số mã C # hiện đại, ngắn gọn để tạo một ngày ngẫu nhiên giữa ngày 1 tháng 1 năm 1995 và ngày hiện tại.
Tôi đang nghĩ một số giải pháp sử dụng Enumerable.Range bằng cách nào đó có thể làm cho điều này ngắn gọn hơn.
Tôi đang tìm kiếm một số mã C # hiện đại, ngắn gọn để tạo một ngày ngẫu nhiên giữa ngày 1 tháng 1 năm 1995 và ngày hiện tại.
Tôi đang nghĩ một số giải pháp sử dụng Enumerable.Range bằng cách nào đó có thể làm cho điều này ngắn gọn hơn.
Câu trả lời:
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));
}
Để có hiệu suất tốt hơn nếu điều này sẽ được gọi nhiều lần, hãy tạo các biến start
và gen
(và có thể thậm chí range
) bên ngoài hàm.
Đây là phản ứng nhẹ với nhận xét của Joel về việc tạo ra một phiên bản tối ưu hơn một chút. Thay vì trả lại một ngày ngẫu nhiên trực tiếp, tại sao không trả về một hàm tạo có thể được gọi liên tục để tạo một ngày ngẫu nhiên.
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();
sau đó bạn gọi nó để có được những ngày ngẫu nhiên: Hãy var randomDate = getRandomDate();
nhớ rằng bạn cần sử dụng lại getRandomDate để điều này hữu ích hơn câu trả lời của Joel.
Tôi đã lấy câu trả lời của @Joel Coehoorn và thực hiện các thay đổi mà anh ấy đã khuyến khích - đưa biến ra khỏi phương thức và đưa tất cả vào lớp. Cộng với thời gian là ngẫu nhiên quá. Đây là kết quả.
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));
}
}
Và ví dụ cách sử dụng để viết 100 DateTimes ngẫu nhiên vào bảng điều khiển:
RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(date.Next());
}
range = (int)(DateTime.Today - start).TotalSeconds;
và return start.AddSeconds(gen.Next(range));
.
Chà, nếu bạn sẽ trình bày tối ưu hóa thay thế, chúng ta cũng có thể đi đến một trình vòng lặp:
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));
}
bạn có thể sử dụng nó như thế này:
int i=0;
foreach(DateTime dt in RandomDay())
{
Console.WriteLine(dt);
if (++i == 10)
break;
}
Bắt đầu với một đối tượng ngày cố định (ngày 1 tháng 1 năm 1995) và thêm số ngày ngẫu nhiên với AddDays (đáng chú ý, chú ý không vượt quá ngày hiện tại).
Tôi đến hơi muộn trong trò chơi, nhưng đây là một giải pháp hoạt động tốt:
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;
}
}
}
Phương thức nhỏ trả về một ngày ngẫu nhiên dưới dạng chuỗi, dựa trên một số tham số đầu vào đơn giản. Được xây dựng dựa trên các biến thể từ các câu trả lời trên:
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);
}