en cuenta la clase de abajo que representa un Broker:elección aleatoria ponderada
public class Broker
{
public string Name = string.Empty;
public int Weight = 0;
public Broker(string n, int w)
{
this.Name = n;
this.Weight = w;
}
}
me gustaría seleccionar al azar a un corredor de una matriz, teniendo en cuenta sus pesos.
¿Qué opinas del código siguiente?
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();
}
}
}
No estoy tan seguro. Cuando ejecuto esto, Broker A siempre obtiene más visitas que Broker D, y tienen el mismo peso.
¿Hay un algoritmo más preciso?
Gracias!
Hola señor, vi su pregunta y se inspiró para crear mi propia clase AdRotator en Java utilizando el algoritmo. Le solicito amablemente que explique cómo seleccionaría los intermediarios de la base de datos si tuviera un millón de intermediarios en la base de datos almacenados en una amplia fila. ¿Seleccionaré la primera ny aplicaré su algoritmo para elegir un corredor al azar y en la próxima solicitud seleccionaré los siguientes n agentes a partir de n + 1 y así sucesivamente? – qualebs
Escribí una biblioteca a lo largo de líneas muy similares ... Tiene algunas características adicionales, y está optimizada para grandes conjuntos de datos: https://github.com/kinetiq/Ether.WeightedSelector –