Tôi có yêu cầu trong dự án .net nơi tôi cần chọn một mục từ bộ sưu tập, mỗi mục có một Trọng số (số nguyên từ 1 đến 10) được gán cho nó. Tôi cần một máy phát ngẫu nhiên sẽ cân nhắc trọng lượng này, tức là, trọng lượng càng cao thì cơ hội càng được chọn càng nhiều. Bất kỳ mẫu mã trong .net được đánh giá cao, mặc dù mô tả thuật toán là tốt đẹp, quá.Tôi cần thuật toán ngẫu nhiên với các tùy chọn cân trong .net
Chỉnh sửa: Sao chép nhanh/dán mã C# trong trường hợp ai đó tình cờ gặp phải điều này.
class RandomWeightedSelector<T>
{
private List<T> items = new List<T>();
public void Add(T item, uint weight = 1)
{
for (int i = 0; i < weight; i++)
items.Add(item);
}
public T GetRandom()
{
return items[new Random().Next(0, items.Count)];
}
}
Bạn không muốn phải tạo ra một ngẫu nhiên mới mỗi cuộc gọi cho 'GetRandom'. Hàm khởi tạo mặc định cho 'Random' hạt giống máy phát có thời gian hoạt động của hệ thống tính bằng mili giây. Nếu bạn gọi 'GetRandom' của bạn nhiều hơn một lần một phần nghìn giây, bạn sẽ được trả về cùng một giá trị. Thậm chí nếu bạn không, bạn có thể trả về kết quả có 'ngẫu nhiên' tồi tệ hơn là chỉ tái sử dụng một cá thể 'Random' duy nhất. – Dolphin