पर विचार करें कि नीचे वर्ग एक ब्रोकर का प्रतिनिधित्व करता है:रैंडम भारित पसंद
public class Broker
{
public string Name = string.Empty;
public int Weight = 0;
public Broker(string n, int w)
{
this.Name = n;
this.Weight = w;
}
}
मैं बेतरतीब ढंग से एक सरणी से एक ब्रोकर का चयन करने, खाते में उनके वजन लेने चाहते हैं।
आप नीचे दिए गए कोड की क्या सोचते हैं?
class Program
{
private static Random _rnd = new Random();
public static Broker GetBroker(List<Broker> brokers, int totalWeight)
{
// totalWeight is the sum of all brokers' weight
int randomNumber = _rnd.Next(0, totalWeight);
Broker selectedBroker = null;
foreach (Broker broker in brokers)
{
if (randomNumber <= broker.Weight)
{
selectedBroker = broker;
break;
}
randomNumber = randomNumber - broker.Weight;
}
return selectedBroker;
}
static void Main(string[] args)
{
List<Broker> brokers = new List<Broker>();
brokers.Add(new Broker("A", 10));
brokers.Add(new Broker("B", 20));
brokers.Add(new Broker("C", 20));
brokers.Add(new Broker("D", 10));
// total the weigth
int totalWeight = 0;
foreach (Broker broker in brokers)
{
totalWeight += broker.Weight;
}
while (true)
{
Dictionary<string, int> result = new Dictionary<string, int>();
Broker selectedBroker = null;
for (int i = 0; i < 1000; i++)
{
selectedBroker = GetBroker(brokers, totalWeight);
if (selectedBroker != null)
{
if (result.ContainsKey(selectedBroker.Name))
{
result[selectedBroker.Name] = result[selectedBroker.Name] + 1;
}
else
{
result.Add(selectedBroker.Name, 1);
}
}
}
Console.WriteLine("A\t\t" + result["A"]);
Console.WriteLine("B\t\t" + result["B"]);
Console.WriteLine("C\t\t" + result["C"]);
Console.WriteLine("D\t\t" + result["D"]);
result.Clear();
Console.WriteLine();
Console.ReadLine();
}
}
}
मैं इतना आत्मविश्वास नहीं हूं। जब मैं इसे चलाता हूं, ब्रोकर ए को ब्रोकर डी की तुलना में हमेशा अधिक हिट मिलती है, और उनके पास वही वज़न होता है।
वहाँ एक और अधिक सटीक एल्गोरिथ्म है?
धन्यवाद!
हैलो सर, मैं अपने प्रश्न को देखा और अपने कलन विधि का उपयोग जावा में अपने ही AdRotator वर्ग बनाने के लिए प्रेरित किया गया। यदि आप विस्तृत पंक्ति में संग्रहीत डेटाबेस पर लाखों ब्रोकर हैं तो मैं आपको कृपया यह बताने के लिए अनुरोध करता हूं कि आप डेटाबेस से दलालों का चयन कैसे करेंगे। क्या मैं पहले एन का चयन करूंगा और यादृच्छिक ब्रोकर चुनने के लिए अपना एल्गोरिदम लागू करूंगा और अगले अनुरोध पर अगले एन ब्रोकरों को एन + 1 से शुरू करने का चयन करें और इसी तरह? – qualebs
मैंने बहुत ही समान लाइनों के साथ एक लाइब्रेरी लिखी है ... इसमें कुछ अतिरिक्त सुविधाएं हैं, और इसे बड़े डेटा सेट के लिए अनुकूलित किया गया है: https://github.com/kinetiq/Ether.WeightedSelector –